• [C#基础]ref和out的区别


     在C#中通过使用方法来获取返回值时,通常只能得到一个返回值。因此,当一个方法需要返回多个值的时候,就需要用到ref和out,那么这两个方法区别在哪儿呢?

    MSDN:
           ref 关键字使参数按引用传递。其效果是,当控制权传递回调用方法时,在方法中对参数所做的任何更改都将反映在该变量中。若要使用 ref 参数,则方法定义和调用方法都必须显式使用 ref 关键字。
          out 关键字会导致参数通过引用来传递。这与 ref 关键字类似,不同之处在于 ref 要求变量必须在传递之前进行初始化。若要使用 out 参数,方法定义和调用方法都必须显式使用 out 关键字。 

    案例:

          定义一个方法,求一个整数数组中的最大值,最小值,和,平均数。如果是一个方法只能有一个返回值,那只能每一个都得定义一个方法来实现,不过有了ref和out这实现起来就方便多了。

    ref:

    复制代码
     1    static int GetIntResult(int[] arry, ref float avg, ref int max, ref int min)
     2         {
     3             int sum = 0;
     4             max = arry[0];
     5             min = arry[0];
     6             for (int i = 0; i < arry.Length; i++)
     7             {
     8                 sum += arry[i];
     9                
    10                 if (max < arry[i])
    11                 {
    12                     max = arry[i];
    13                 }
    14                 if (min > arry[i])
    15                 {
    16                     min = arry[i];
    17                 }
    18             }
    19             avg = sum / arry.Length;
    20             return sum;
    21         }
    复制代码

          然后在控制台中试着调用该方法:

    复制代码
    1      static void Main(string[] args)
    2         {
    3             int[] arr = { 1,2,3,4,5,6,7,8,9};
    4             float avg;
    5             int max;
    6             int min;
    7             int sum = GetIntResult(arr, ref avg, ref max, ref min);
    8         }
    复制代码

          此时编译器就会提示画红线,错误:使用了未赋值的avg,max,min

    复制代码
     1       static void Main(string[] args)
     2         {
     3             int[] arr = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
     4             float avg = 0;
     5             int max = 0;
     6             int min = 0;
     7             int sum = GetIntResult(arr, ref avg, ref max, ref min);
     8             Console.WriteLine("和:{0}	平均值:{1}	最大值:{2}	最小值:{3}", sum, avg, max, min);
     9             Console.Read();
    10         }
    复制代码

    运行结果:

    总结:

          ref这个关键字告诉c#编译器被传递的参数值指向与调用代码中变量相同的内存。这样,如果被调用的方法修改了这些值然后返回的话,调用代码的变量也就被修改了。

          ref 关键字使参数按引用传递。其效果是,当控制权传递回调用方法时,在方法中对参数所做的任何更改都将反映在该变量中(avg,max,min的初始值为0,调用方法后值改变)。若要使用 ref 参数,则方法定义和调用方法都必须显式使用 ref 关键字。

    out:

          换成out之后,上面的方法不再适用,报错,错误 : 控制离开当前方法之前必须对 out 参数“min”和"max"赋值。你会发现这里max和min在循环外并未初始化。所以才会出错。

    修改后代码:

     View Code

         结果和上面一样。

    总结:
           out 关键字会导致参数通过引用来传递。这与 ref 关键字类似,不同之处在于 ref 要求变量必须在传递之前进行初始化。若要使用 out 参数,方法定义和调用方法都必须显式使用 out 关键字。

    结论:

           关键字“ref“和”out”之间的唯一区别就是关键字”out“不要求调用代码初始化要传递的参数值。那么关键字‘ref”什么时候用呢?当您需要确保调用方法已经初始化参数值的时候,您就应该使用关键字“ref”。在上面例子中,能够使用“out“是因为被调用的方法并不依赖于被传递的变量的值。个中滋味慢慢体会......

  • 相关阅读:
    Java实现 蓝桥杯VIP 算法提高 交换Easy
    Java实现 蓝桥杯VIP 算法提高 多项式输出
    Java实现 蓝桥杯VIP 算法提高 多项式输出
    Java实现 蓝桥杯VIP 算法提高 多项式输出
    Java实现 蓝桥杯VIP 算法提高 多项式输出
    Java实现 蓝桥杯VIP 算法提高 多项式输出
    Java实现 蓝桥杯VIP 算法训练 矩阵乘方
    QT中给各控件增加背景图片(可缩放可旋转)的几种方法
    回调函数实现类似QT中信号机制
    std::string的Copy-on-Write:不如想象中美好(VC不使用这种方式,而使用对小字符串更友好的SSO实现)
  • 原文地址:https://www.cnblogs.com/zxtceq/p/7791601.html
Copyright © 2020-2023  润新知