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

2018-06-23  本文已影响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();
        }
    }
}
上一篇下一篇

猜你喜欢

热点阅读