在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}");
测试运行结果: