c#中ref和out使用及区别

在c#中,使用方法获得返回值时,只能获取一个返回值。当使用ref和out关键字后,可以获取多个返回值。

MSDN对ref和out关键字的说明如下:

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

它们的区别在于: ref 要求变量必须在传递之前进行初始化;而out不需要初始(或者初始化也不会影响到方法内部的值,所以你初始化没用),需要在方法内部赋值或者初始化。

我们用一个例子来测试一下ref和out关键字的使用。

首先我们定义一个方法,计算一个int数组中的和,最大值,最小值和平均值。

代码如下:使用ref关键字

 1  public int GetIntResult(int[] arr,ref int max,ref int min,ref double avg)
 2         {
 3             int sum = 0;
 4             max = arr[0];
 5             min = arr[0];
 6             for (int i = 0; i < arr.Length; i++)
 7             {
 8                 sum += arr[i];
 9 
10                 if (max < arr[i]) max = arr[i];
11                 if (min > arr[i]) min = arr[i];
12 
13 
14             }
15             avg = sum / arr.Length;
16             return sum;
17         }

在主方法中调用上面的方法代码:

我们先测试当为定义的变量不初始化时,程序会提示什么错误呢?会系统使用了为初始化的变量。所以说在使用ref关键字时,必须对变量初始化。提示错误如下图:

测试使用关键字ref的主方法代码如下:

1 int[] arry = new int[] {3,9,10,20,50,2,23,30 };
2                     int max=0;
3                     int min=0;
4                     double avg=0 ;
5                     Test test = new Test(); 
6                     int sum = test.GetIntResult(arry,ref max,ref min,ref avg);//调用时也需要使用关键字
7                     Console.WriteLine($"sum:{sum} max:{max} min:{min} avg:{avg}");

运行程序,测试结果:

使用out关键字,跟测试ref关键字相同。

1  int[] arry = new int[] { 3, 9, 10, 20, 50, 2, 23, 30 };
2                 int max=1;////在使用out关键字时,不需要在此处初始化,初始化也不会影响到方法内部的值,所以你初始化没用
3                 int min=3;
4                 double avg=4;
5                 Test test = new Test();
6                 int sum = test.GetIntResult(arry, out max, out min, out avg);//调用时也需要使用关键字
7                 Console.WriteLine($"sum:{sum} max:{max} min:{min} avg:{avg}");

测试结果跟上面。

我们来继续同时使用ref和out关键字测试。代码如下:

1   public string GetStringResult(string code,ref string name,out int age)
2         {
3            age = 18; //
4             //deSomething..........
5             return code;
6         }

主方法调用测试上面方法代码如下:

1  string code = "x9527";
2                 string name = "詹姆斯邦德";
3                 int age = 99;//我们在这里赋值,等运行的时候看看.....会输出什么
4                 Test test = new Test();
5                 string strCode= test.GetStringResult(code,ref name,out age);
6                 Console.WriteLine($"name={name} code={code} age={age}");

测试运行结果:

原文地址:https://www.cnblogs.com/maowp/p/8267311.html