none
为什么不能通过形参修改实参的引用对象?? RRS feed

  • 问题

  •     class myClass
        {
            public int Number;
            public static void Exchange(myClass param)
            {
                param = new myClass();
            }
        }

        class Program
        {
            static void Main(string[] args)
            {
                myClass  one = new myClass();
                one.Number = 42;
                Console.WriteLine(one.Number);
                myClass.Exchange( one);
                Console.WriteLine(one.Number);

            }
        }
    这段代码我试图将 one 的引用对象修改一下,但两次输出的结果都为42,没有修改成功

    我尝试过通过形参 param 修改 one 的 Number 属性成功了,但为什么就不让直接修改引用对象呢?? (我也知道有 ref 关键字不过~~)

    感觉这种实参传递给形参有点像:

                myClass one = new myClass();
                myClass two = new myClass();
                two = one;

    本人0基础,纯新手。求高手指导,求内幕!




    • 已编辑 lolanto 2012年7月29日 12:20
    2012年7月29日 11:13

答案

  • >>这段代码我试图将 one 的引用对象修改一下,但两次输出的结果都为42,没有修改成功

    对不起,这里有一个概念你要清楚(Exchange函数中的变量param是一个局部变量,这个变量只能在函数内部使用)。

    那么当你调用:myClass.Exchange(one);

    此时param可以理解为一个指针,指针指向one这个实体。

    但是注意——param = new myClass();这句话会把param重新指向一个新的实体myClass,那么此时原来的one就没有指针指向它了,自然不发生任何改变。

    若需要改变类的参数,必须保证指针指向的对象不发生改变,这样尝试:

    class myClass
        {
            public int Number;
            public static void Exchange(myClass param)
            {
                param.Number = 1;
            }
        }
        class Program
        {
            static void Main(string[] args)
            {
                myClass  one = new myClass();
                one.Number = 42;
                Console.WriteLine(one.Number);
                myClass.Exchange(one);
                Console.WriteLine(one.Number);
            }
        }

    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    • 已标记为答案 lolanto 2012年7月30日 13:14
    2012年7月29日 12:39
    版主
  • >>形参可以指向其他对象。即 形参——>新对象 ; 实参——>旧对象 ?

    是的。因为形参是一个类指针,在调用函数的时候动态在函数内部创建的,函数调用执行完毕之后自动释放。

    >>而添加了ref 修饰符,形参和实参的关系就会变为:形参(实参)——>对象?形参指向其他对象。即形参(实参)——>新对象 ?

    ref与其说是引用,我倒宁愿称其为“别名”(借助C的&符号)。你可以这样理解:凡是加了ref的永远都是对传入函数的内容操作。相当于说你自己有一个真正的中文名称,但是你论坛上确实lanloto,lanloto还是指你自己(别名而已!)


    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    • 已标记为答案 lolanto 2012年7月30日 13:14
    2012年7月30日 11:39
    版主

全部回复

  • >>这段代码我试图将 one 的引用对象修改一下,但两次输出的结果都为42,没有修改成功

    对不起,这里有一个概念你要清楚(Exchange函数中的变量param是一个局部变量,这个变量只能在函数内部使用)。

    那么当你调用:myClass.Exchange(one);

    此时param可以理解为一个指针,指针指向one这个实体。

    但是注意——param = new myClass();这句话会把param重新指向一个新的实体myClass,那么此时原来的one就没有指针指向它了,自然不发生任何改变。

    若需要改变类的参数,必须保证指针指向的对象不发生改变,这样尝试:

    class myClass
        {
            public int Number;
            public static void Exchange(myClass param)
            {
                param.Number = 1;
            }
        }
        class Program
        {
            static void Main(string[] args)
            {
                myClass  one = new myClass();
                one.Number = 42;
                Console.WriteLine(one.Number);
                myClass.Exchange(one);
                Console.WriteLine(one.Number);
            }
        }

    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    • 已标记为答案 lolanto 2012年7月30日 13:14
    2012年7月29日 12:39
    版主
  • 有个问题:

    假如引用类型变量不用ref 修饰直接传到方法中(如上述代码),那么形参和实参的关系是不是这样:

    形参——>实参——>对象

    于是就会出现你所说的, 形参可以指向其他对象。即 形参——>新对象 ; 实参——>旧对象

    ————————————————————————————————————————————————————

    添加ref 修饰符,形参和实参的关系就会变为:

    形参(实参)——>对象

    形参指向其他对象。即形参(实参)——>新对象

    2012年7月30日 4:03
  • >>形参可以指向其他对象。即 形参——>新对象 ; 实参——>旧对象 ?

    是的。因为形参是一个类指针,在调用函数的时候动态在函数内部创建的,函数调用执行完毕之后自动释放。

    >>而添加了ref 修饰符,形参和实参的关系就会变为:形参(实参)——>对象?形参指向其他对象。即形参(实参)——>新对象 ?

    ref与其说是引用,我倒宁愿称其为“别名”(借助C的&符号)。你可以这样理解:凡是加了ref的永远都是对传入函数的内容操作。相当于说你自己有一个真正的中文名称,但是你论坛上确实lanloto,lanloto还是指你自己(别名而已!)


    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    • 已标记为答案 lolanto 2012年7月30日 13:14
    2012年7月30日 11:39
    版主