• 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!

  • 相关阅读:
    清除大文本中的html标签
    页面中富文本的使用
    artDialog的几种基本使用
    SQL基础-->层次化查询(START BY ... CONNECT BY PRIOR)[转]
    Struts2
    js中window.location的用法
    keycode键盘 按键
    jQuery升级踩坑之路
    生成唯一随机码的方法及优缺点分析
    百度API的经历,怎样为多个点添加带检索功能的信息窗口
  • 原文地址:https://www.cnblogs.com/dcy521/p/10949076.html
Copyright © 2020-2023  润新知