我有一个一直比较困扰的关于变量使用域的问题
例://全局变量数组
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处每执行一次循环就会给这个数组第二维开辟一个内存空间 而随着每次循环结束这个空间是否已经释放掉,如果
释放掉为什么最终又有值呢

解决方案 »

  1.   

    //全局变量数组
    float [][] exArray =new float[10][];
      

  2.   

    说啥,没有看懂,还有,什么叫“局部方法结束内存被释放所以全局变量会为null”那还叫全局干什么?全局变量怎么可能会被影响?
      

  3.   

    简单的说 就是  如果全局数组exArray未初始化 那么调用MethodEx2方法后 exArray仍然为null
    如果exArray被初始化exArray = new float[10][]; 再调用MethodEx2方法后 exArray 会得到值
    也就是说在局部方法中初始化最终无效 但为什么在局部方法中初始化第二维数组却没问题
      

  4.   

    兄弟,这个就是全局变量的用法啊,全局变量就是要在全局结束后才释放。
    举例说,我有登录系统,有加密后密码和ID两个属性(全局),这个时候我通过MD5加密,这个是个局部方法,我给密码赋值,但是为了重用性高,就是不能让MD5算法结束后变量被回收,所以我们使用全局变量。
      

  5.   

    我的意思是说  给全局变量在全局初始化然后调用局部方法最后可以给全局变量赋值
    如果给全局变量在局部初始化最后全局变量仍然为null
    但为什么我给全局二维数组变量全局初始化第一维  而第二维在局部初始化却仍然有值呢  按理说应该只有第一维而第二维为null啊
      

  6.   


    //全局变量数组
    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,所以就跟全局变量没任何关系了
    }
    楼主这个不是全局变量的问题
      

  7.   


    //全局变量数组
    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作为参数传了过去,显然初始化不到全局变量
      

  8.   

    看下面的引用类型参数就是按引用传递吗?
    http://blog.csdn.net/vrhero/archive/2010/01/09/5166278.aspx在.NET中,除非显式以ref或out声明传递参数,否则所有类型的参数都是按值传递的!引用类型也不会例外!
      

  9.   

    我的印象也是要有 ref 或 out 或 static 才是引用传递,可是说的太有气势了,搞的怀疑了,呵呵,我查了半天资料,好像没有说啊
      

  10.   

    大家好像没明白我的意思 不好意思我再重新说明一下  这个问题不是值传递或引用地址的问题
    例子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
      

  11.   

    你可以把你那個所謂的全局數組設成static
      

  12.   

    你穿进去的是 null,和全局变量已经没有关系了。归根到底楼主对变量的作用范围和参数传递没搞清楚。
      

  13.   

    好吧   我随便初始化全局变量 不用null了float [][] exArray = new float[20][];
    ..
    ..
    ..
    //私有方法
    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列的数组
      

  14.   

    看下面的引用类型参数就是按引用传递吗?
    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的改变,因为两者现在根本不是同一个引用了.