zoukankan      html  css  js  c++  java
  • 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!

  • 相关阅读:
    HashMap实现分析
    序列化与transient
    MySQL计划任务(事件调度器)(Event Scheduler)[转]
    利用innodb_force_recovery修复MySQL数据页损坏
    Java对Jar文件的操作[转]
    聚集索引与非聚集索引
    JVM学习(二)
    一句道破所有的springmvc(面试必备)
    springboot中的外界jar的引入:
    springboot中的springSession的存储和获取
  • 原文地址:https://www.cnblogs.com/dcy521/p/10949076.html
Copyright © 2011-2022 走看看