美文网首页
细讲C#中的ref与out的区别

细讲C#中的ref与out的区别

作者: 没伞的小孩 | 来源:发表于2018-06-23 14:47 被阅读0次

    很多时候参数按地址传递时加有OUT关键字,到底他和REF有什么区别呢?

    好,我们直奔主题,ref是传递参数的地址,out是返回值,两者有一定的相同之处,不过也有不同点。

    使用ref前必须对变量赋值,out不用。

    
    namespace test
    
    {
    
        class Program
    
        {
    
             //一个 out 测试的静态方法
            static void outTest(out int x,out int y) {
                /*
                离开这个函数前,必须对x和y赋值,否则会报错。
                 y=x
                上面这行会报错,因为使用了out后,x和y都清空了,需要重新赋值,即使用过函数前赋值也不行
                */
                x = 1;
                y = 1;
            }
    
            //一个ref测试的静态方法(方法内没有任何处理)
            static void refTest(ref int x, ref int y) {}
            //一个ref测试的静态方法(方法内对x,y做个简单的处理)
            static void refTest2(ref int x, ref int y) {
                x = y;
            }
    
            static void Main(string[] args)
            {
                int a, b; //这两个初始化并没有赋值对不对
                outTest(out a,out b);
                Console.WriteLine("a={0};b={1}",a,b);
                //打印结果:a=1;b=1
                int c = 11, d = 22;//这两参数开始是有赋值的对不对
                outTest(out c, out d);
                Console.WriteLine("c={0};d={1}",c,d);
                //打印结果:c=1;d=1
                //现在开始ref
                int m, n;//这两个变量没有赋值,
                //现在我们调用refTest方法 看可不可以
                // refTest(ref m, ref n);  //抱错对不对,为什么,ref使用前,变量必须赋值
                int o = 11, p = 22;
                refTest(ref o, ref p);
                Console.WriteLine("o={0};p={1}",o,p);
                //打印结果:o=11;p=22
                int k = 11, j = 22;
                refTest2(ref k, ref j);
                Console.WriteLine("k={0};j={1}",k,j);
                //打印结果:k=22;j=22
                Console.ReadKey();
            }
        }
    }
    
    • 所以他们的特点很明显
      1.out类型参数是按地址传递,能改变原来的数值,使用out传参前,对变量可以赋值也可以不赋值。带有out类型参数的函数, 会清空变量,所以在离开该函数的时候,所有out引用的变量都要赋值。
      2.ref类型参数是按地址传递,能改变原来的数值,使用ref传参前,变量必须赋值,带有ref类型参数的函数,不会清空变量,所以离开该函数的时候,所有ref引用的变量可以赋值也可以不赋值。

    相关文章

      网友评论

          本文标题:细讲C#中的ref与out的区别

          本文链接:https://www.haomeiwen.com/subject/wggryftx.html