C#基础 Out和Ref复习

在平时做开发时候,调用方法获得返回值都是只能获得一个返回值的,但是有时候我们需要获得多个,比如:我想要返回一个字符串,同时还想要一个List数组,但是一个方法只能有一个return,所以在这种情况官方就提供给我们新的方法实现我们想要的结果!

Ref 和 Out 两者比较

共同点outref都是传递引用(内存地址),使用后都将改变原来参数的数值。

不同点ref是有进有出,out是只出不进(就是把一个参数通过传入方法时候,会自动清空原先所有,变为一个干净的参数):ref可以把参数的值传入函数,但无法通过out把一个数值传入方法中,ref参数在使用前必需初始化,而out不需要(初始化也没鸟用,早晚清空)。

代码示例:

调用方法,传入引用,改变字符串的值:

static void RefOrOutTest()
        {
            string name = "张三";
            RefTest(ref name);
            Console.WriteLine(name);//调用方法之后,原先值改变,打印: 李四!
        }

        static void RefTest(ref string str)
        {
            str = "李四";
        }
static void RefOrOutTest()
        {
            string name = "张三";
            OutTest(out name);
            Console.WriteLine(name);//调用方法之后,原先值改变,打印: 李四
        }

        static void OutTest(out string str)
        {
            str = "李四";
        }

可以看出,无论用ref还是用out,都是一样的结果!条件都一样,传入时候都进行的初始化赋值,进入方法后又重新赋值!

再进一步测试:

static void RefOrOutTest()
        {
            string name = "张三";
            RefTest(ref name);
        }

        static void RefTest(ref string str)
        {
            Console.WriteLine(str);//打印: 张三            
        }

这样写依旧可以打印出原先的值,但是将ref改为out,编译器就会报错!

这就准确的说明了:out参数在进入方法的时候,C#会自动清空它的一切引用和指向,所以在上面的out例子中,必需先要为str参数赋值。如以下程序。

static void RefOrOutTest()
        {
            string name = "张三";
            OutTest(out name);
        }

        static void OutTest(out string str)
        {
            str = "王五";
            Console.WriteLine(str);//打印: 王五            
        }

再进一步测试:

static void RefOrOutTest()
        {
            string name;
            OutTest(out name);
            Console.WriteLine(name);//打印:王五
        }

        static void OutTest(out string str)
        {
            str = "王五";
        }

再未初始化的时候用out依旧可以传递!再来看下边用ref传递就会报错:

static void RefOrOutTest()
        {
            string name;
            RefTest(ref name);
            Console.WriteLine(name);
        }

        static void RefTest(ref string str)
        {
            str = "王五";
        }    

报错:

可以看出,在没有初始化的情况下,out依旧可以传递,因为就算你初始化了还是被清空,而ref就不可以,在传递前必须进行初始化

最后大概总结一下:在我们需要多个返回值的时候,就用out,在需要修改修改原先引用的时候用ref!

猜你喜欢

转载自www.cnblogs.com/dcy521/p/10949076.html
今日推荐