none
关于 out 关键字的问题 RRS feed

  • 问题

  • 书上写 out 可以让实参在传入方法后再初始化赋值,但是看下这段代码

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

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

    我在调用方法之前已经初始化赋值过一次,方法里又初始化了一次,这不就初始化了两次吗?编译器为什么不报错??

    (其实我在想,是不是调用前初始化让 one 引用了 对象1 ,然后再在方法中应用了 对象2)

    2012年7月29日 12:27

答案

  • >>我在调用方法之前已经初始化赋值过一次,方法里又初始化了一次,这不就初始化了两次吗?编译器为什么不报错??

    out参数你记住一点——该参数不能作为返回值,该参数只能被赋值。书上说得完全正确——out 可以让实参在传入方法后再初始化赋值表示“传入的参数可以是任意情况,包括是null的”。

    >>其实我在想,是不是调用前初始化让 one 引用了 对象1 ,然后再在方法中应用了 对象2

    是的,一个对象变量名称只能引用一个对象实例。


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

    • 已标记为答案 lolanto 2012年7月30日 13:15
    2012年7月29日 12:32
    版主

全部回复

  • >>我在调用方法之前已经初始化赋值过一次,方法里又初始化了一次,这不就初始化了两次吗?编译器为什么不报错??

    out参数你记住一点——该参数不能作为返回值,该参数只能被赋值。书上说得完全正确——out 可以让实参在传入方法后再初始化赋值表示“传入的参数可以是任意情况,包括是null的”。

    >>其实我在想,是不是调用前初始化让 one 引用了 对象1 ,然后再在方法中应用了 对象2

    是的,一个对象变量名称只能引用一个对象实例。


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

    • 已标记为答案 lolanto 2012年7月30日 13:15
    2012年7月29日 12:32
    版主
  • 首先感谢你的回答。

    另外我想有几个困惑

    >>out参数你记住一点——该参数不能作为返回值,该参数只能被赋值。

    out参数是不是指我上面代码中的 one 变量?

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

    我在网上查过资料说 out 这个关键字会清空所修饰变量原来的值;

    即:           myClass one = new myClass();
                myClass.Exchange(out one);         //这个时候 one 之前引用的对象会被清空,所以需要在调用方法里面重新赋值。是这样吗?

    2012年7月30日 3:36
  • 2012年7月30日 11:40
    版主