网上看了许多关于"out与ref的区别"的文章, 感觉都理解得不够透彻, 说什么"使用ref关键字时, 传入的参数必须先被初始化; 使用out关键字时, 必须在被函数体内完成其初始化" 这些都是属于编码写法上的区别, 我想寻求一个本质上的区别, 到底有什么工作是out能做的, 而ref却做不了的. 又或者是ref能做的, 而用out却做不了的...
如果用out写出的任何程序都能用ref完成, 那么这两个东西还有什么区别? 倒不如C#就用一个out算了, 这么麻烦还要搞出一个ref来多余!请大家写出一个例子:
用out写一个函数, 要求得出的结果只能用out实现, 而用ref却无法实现! 又或者是用ref能实现的程序用out却无法实现!谢谢大家, 60分寻求这样的一个例子, 请高手们帮帮帮忙!

解决方案 »

  1.   

    有一点你是对的,它们本质上没有区别 - ref int和out int编译成il代码后都是Int32& i,只不过编译器会对后者加上一个说明性的[Out]属性。但在编程上,它们却提供了很重要的指示性的作用。程序员看到ref和out就可以非常清晰的知道变量是用来传入传出,或仅仅是传出的,是调用着初始化还是被调用者初始化。
      

  2.   

     class Program
        {
            //使用out后必须对变量赋值
            public void TestOut(out int x, out int y)
            {
                x = 1;
                y = 2;
            }
            //此时传进来的值分别为x1:10,y1:11,输出之后的x1的值为2        public void TestRef(ref int x, ref int y)
            {
                //引用剪剪那句话传进来的是猪,出来的可能是头牛(很精辟!)
                x = 2;
                
            }
            static void Main(string[] args)
            {
                int x;
                int y;
                Program P1 = new Program();
                P1.TestOut(out x,out y);
                Console.WriteLine("x={0},y={1}", x, y);
                //在使用之前ref必须对变量赋值
                int x1 = 10;
                int Y1 = 11;
                P1.TestRef(ref x1,ref Y1);
                Console.WriteLine("x1={0},y1={1}", x1, Y1);
            }
        }
      

  3.   

    http://blog.csdn.net/ws_hgo/archive/2009/04/11/4064487.aspx
      

  4.   

    只知道 ref传入引用 out传出
      

  5.   

    out 是传出 所以需要对其参数赋值ref 是传进 可以不对参数赋值,不过在调用的时候还是需要对参数赋值,结果优先取决于方法里参数的赋值,如果方法里没有赋值结果就是调用的时候的参数赋的值