我有一个一直比较困扰的关于变量使用域的问题
例://全局变量数组
float [][] exArray = null;
..
..
..
//私有方法
private void MethodEx(float [][] exA)
{
//初始化数组
//问题1
exA = new float[10][];
//循环初始化数组
for(int i = 0; i < exA.Length; i++)
{
//问题2
exA[i] = new float[5];
for(int j = 0; j < exA[i].Length; j++)
{
//数组初始化
exA[i][j] = 55f;
}
}
}//公有方法
public void MethodEx2()
{
//调用私有方法,传入全局数组
//*****此时数组为null,未初始化
//exArray = new float[10][]; 问题3
MethodEx(exArray)
}
数组是传递地址的 所以不存在值传递问题下来我想问的是当我调用MethodEx2方法的时候 如果在MethodEx方法里初始化数组exArray 那么最后MethodEx执行完
全局数组exArray仍然为null
但如果我把问题3的注释去掉 将方法中初始化注释的话 会得到被赋值的全局数组
以上问题我是这么想的 如果在局部方法中给一个全局的变量开辟一个内存空间的话,随着局部方法结束内存被释放所以
全局变量会为null
当在有效范围给全局变量初始化然后将他传入局部方法时(引用传递)全局变量会被赋值, 但问题2的地方改如何解释呢?
在问题2处每执行一次循环就会给这个数组第二维开辟一个内存空间 而随着每次循环结束这个空间是否已经释放掉,如果
释放掉为什么最终又有值呢
例://全局变量数组
float [][] exArray = null;
..
..
..
//私有方法
private void MethodEx(float [][] exA)
{
//初始化数组
//问题1
exA = new float[10][];
//循环初始化数组
for(int i = 0; i < exA.Length; i++)
{
//问题2
exA[i] = new float[5];
for(int j = 0; j < exA[i].Length; j++)
{
//数组初始化
exA[i][j] = 55f;
}
}
}//公有方法
public void MethodEx2()
{
//调用私有方法,传入全局数组
//*****此时数组为null,未初始化
//exArray = new float[10][]; 问题3
MethodEx(exArray)
}
数组是传递地址的 所以不存在值传递问题下来我想问的是当我调用MethodEx2方法的时候 如果在MethodEx方法里初始化数组exArray 那么最后MethodEx执行完
全局数组exArray仍然为null
但如果我把问题3的注释去掉 将方法中初始化注释的话 会得到被赋值的全局数组
以上问题我是这么想的 如果在局部方法中给一个全局的变量开辟一个内存空间的话,随着局部方法结束内存被释放所以
全局变量会为null
当在有效范围给全局变量初始化然后将他传入局部方法时(引用传递)全局变量会被赋值, 但问题2的地方改如何解释呢?
在问题2处每执行一次循环就会给这个数组第二维开辟一个内存空间 而随着每次循环结束这个空间是否已经释放掉,如果
释放掉为什么最终又有值呢
float [][] exArray =new float[10][];
如果exArray被初始化exArray = new float[10][]; 再调用MethodEx2方法后 exArray 会得到值
也就是说在局部方法中初始化最终无效 但为什么在局部方法中初始化第二维数组却没问题
举例说,我有登录系统,有加密后密码和ID两个属性(全局),这个时候我通过MD5加密,这个是个局部方法,我给密码赋值,但是为了重用性高,就是不能让MD5算法结束后变量被回收,所以我们使用全局变量。
如果给全局变量在局部初始化最后全局变量仍然为null
但为什么我给全局二维数组变量全局初始化第一维 而第二维在局部初始化却仍然有值呢 按理说应该只有第一维而第二维为null啊
//全局变量数组
float [][] exArray = null;
..
..
..
//私有方法
private void MethodEx(float [][] exA)
{
//初始化数组
//问题1
exA = new float[10][];//你传入的是null,而不是全局变量,所以在这这个数组相当于局部变量,根本就没有给全局变量赋值,明白了吗
//循环初始化数组
for(int i = 0; i < exA.Length; i++)
{
//问题2
exA[i] = new float[5];
for(int j = 0; j < exA[i].Length; j++)
{
//数组初始化
exA[i][j] = 55f;
}
}
}//公有方法
public void MethodEx2()
{
//调用私有方法,传入全局数组
//*****此时数组为null,未初始化
//exArray = new float[10][]; 问题3
MethodEx(exArray)//在这你传入的是一个null,所以就跟全局变量没任何关系了
}
楼主这个不是全局变量的问题
//全局变量数组
float [][] exArray = null;
..
..
..
//私有方法
private void MethodEx(float [][] exA)
{
//初始化数组
//问题1
exA = new float[10][];你传入的是null,而不是全局变量,所以在这这个数组相当于局部变量,根本就没有给全局变量赋值,明白了吗
//循环初始化数组
for(int i = 0; i < exA.Length; i++)
{
//问题2
exA[i] = new float[5];
for(int j = 0; j < exA[i].Length; j++)
{
//数组初始化
exA[i][j] = 55f;
}
}
}//公有方法
public void MethodEx2()
{
//调用私有方法,传入全局数组
//*****此时数组为null,未初始化
//exArray = new float[10][]; 问题3
MethodEx(exArray)在这你传入的是一个null,所以就跟全局变量没任何关系了
}
在调用函数前,楼主并没有给数组初始化,是null,然后把null作为参数传了过去,显然初始化不到全局变量
http://blog.csdn.net/vrhero/archive/2010/01/09/5166278.aspx在.NET中,除非显式以ref或out声明传递参数,否则所有类型的参数都是按值传递的!引用类型也不会例外!
例子1float [][] exArray = new float[10][];
..
..
..
//私有方法
private void MethodEx(float [][] exA)
{
//循环初始化数组
for(int i = 0; i < exA.Length; i++)
{
//!!!!!!!定义第二维数组内存大小
exA[i] = new float[5];
for(int j = 0; j < exA[i].Length; j++)
{
//数组初始化
exA[i][j] = 55f;
}
}
}//公有方法
public void MethodEx2()
{
//调用私有方法,传入全局数组 !!!!!!此时全局数组已初始化第一维大小
MethodEx(exArray)
}通过例1我可以得到一个已经全部赋值的全局数组
例2float [][] exArray = null;
..
..
..
//私有方法
private void MethodEx(float [][] exA)
{
//局部定义数组大小
exA = new float[10][];
//循环初始化数组
for(int i = 0; i < exA.Length; i++)
{
//定义第二维数组内存大小
exA[i] = new float[5];
for(int j = 0; j < exA[i].Length; j++)
{
//数组初始化
exA[i][j] = 55f;
}
}
}//公有方法
public void MethodEx2()
{
//调用私有方法,传入全局数组 !!!!!!此时全局数组为null
MethodEx(exArray)
}例2数组仍然为null关于例1和例2我是这样理解的 在局部开辟了一个内存空间new float[10][];赋值给全局数组会随着局部方法
结束而释放掉这个内存 所以全局数组变量仍然为null
但在例1和例2中都是在局部开辟的第二维内存空间赋值给全局数组 为什么在例1中局部开辟的第二维数组大小在局部方法结束后仍然不释放 全局数组仍然有值呢
我的理解例1应该得到这样的全局数组 exArray[0] = null exArray[1] = null .... exArray[9] = null
..
..
..
//私有方法
private void MethodEx(float [][] exA)
{
//局部定义数组大小
exA = new float[10][];
//循环初始化数组
for(int i = 0; i < exA.Length; i++)
{
//定义第二维数组内存大小
exA[i] = new float[5];
for(int j = 0; j < exA[i].Length; j++)
{
//数组初始化
exA[i][j] = 55f;
}
}
}//公有方法
public void MethodEx2()
{
//调用私有方法,传入全局数组 !!!!!!此时全局数组为20
MethodEx(exArray)
}
得到一个20行null列的数组
http://blog.csdn.net/vrhero/archive/2010/01/09/5166278.aspx在.NET中,除非显式以ref或out声明传递参数,否则所有类型的参数都是按值传递的!引用类型也不会例外!这里面的你还是没看懂.你在18楼的代码,例1中exArray指向一个float [][]的实例,在调用MethodEx方法时传进去的exA也是一个指向一个float [][]的实例,只是这两个实例指向的都是同一个引用,但是这两个实例在内存中的存放地址是不一样的.所以对exA的修改会导致exArray的改变同样的在例2中,exA = new float[10][];就是让exA 指向一个新的float [][]的实例,放弃了对原来的exArray实例的引用,所以对exA 的任何修改都不会导致exArray的改变,因为两者现在根本不是同一个引用了.