C# OUT 关键字学习
OUT的简单使用:
static void Main(string[] args)
{
int[] arr = { 1, 5, 2, 6, 0, 3, 9, 4, 2 };
int max, min;
float average;
UseOut(arr, out max,out min,out average);
Console.WriteLine("The Max is {0}", max);
Console.WriteLine("The Min is {0}", min);
Console.WriteLine("The Average is {0}", average);
}
static void UseOut(int[]arr,out int max,out int min,out float average)
{
max = arr[6];
min = arr[4];
average = 0;
foreach (int i in arr)
average += i;
average /= arr.Length;
}
上面的代码中,UseOut函数想要返回三个值,分别是最大值max,最小值min,平均值average,本来可以通过返回一个数组来返回这三个结果,但是average是float类型的,max和min是int类型的,因此无法存到同一个数组中。此时就可以用out来返回三个不同类型的结果。
OUT和ref关键字的区别:
原blog:https://blog.csdn.net/hejingfang123/article/details/78452453
我们知道,在c#中,当我们在一个方法中想要访问另一个方法中的变量的时候,有两种解决方案---参数和返回值。但当需要返回多个值,并且是不同类型的值的之后应该怎么办呢?解决方案可以是
(1)将所有类型数据转换成字符串类型,到最后再都转换回来,这样就比较麻烦了
(2)利用方法的out参数和ref参数
下面要跟大家介绍的就是第二个简单的方法:方法的out和ref参数
在讲解方法的out和ref参数之前我们先看看最普通的参数传递
static void Main(string[] args)
{
int number1=10;
int number2 = 20;
int sum = AddNumber(number1, number2);
Console.WriteLine(number1); ;
Console.WriteLine(number2);
Console.WriteLine(sum);
Console.ReadKey();
}
public static int AddNumber( int num1, int num2)
{
return num1 + num2;
}
显而易见,此程序的返回值是10,20,30
方法的out参数(与最简单的参数传递差别已用红框标出)
此程序的输出结果为10,200,210
概念:out是内部为外部变量赋值,out一般用在函数需要有多个返回值的场所
总结:1.如果方法的参数用out修饰了,那么这个参数在方法外也要用out修饰
2.如果方法的参数用out修饰了,那么在方法外面可以不给这个参数赋值,但是在方法里必须给这个参数赋初值
3.当参数在方法外进行赋值时,参数out把方法里的值传到了方法外,所以最后参数值为在方法里赋的值
例题1:
static void Main(string[] args)
{
int number1=10;
int number2=20;
int sum = AddNumber( number1, out number2);
Console.WriteLine(number1); ;
Console.WriteLine(number2);
Console.WriteLine(sum);
Console.ReadKey();
}
public static int AddNumber(int num1, out int num2)
{
num1 = 100;
num2 = 200;
return num1 + num2;
}
此程序的输出结果是什么呢???
开始我理所应当的认为,此程序的返回值为100,200,300,但是大家再仔细看一看,num1没有用out修饰,num2用了out修饰,这可是一个大坑哦!
所以,最后的结果是10,200,300
为什么最后输出的sum是300呢?因为在调用AddNumber这个方法的时候,不管我们开始给num1和num2传的是什么值,在这个方法里都重新给这两个参数赋值了,因此,输出的结果应该是重新赋值的两个参数的和,即100+200=300
方法的ref参数(与最简单的参数传递差别已用红框标出)
此程序的返回值为10,200,210
很容易可以看出,方法的out和ref只是修改参数,那么他们最后的返回值是相同的
总结:1.如果方法用参数out修饰了,那么参数在方法外也要用out修饰
2.如果方法用参数ref修饰了,那么在方法里面可以不给这个参数赋值,但是在方法外必须给这个参数赋初值
3.当参数在方法外进行赋值时,参数ref把方法里的值传到了方法外,所以最后参数值为在方法里赋的值
那么当这种情况呢?
例题2:
static void Main(string[] args)
{
int number1=10;
int number2=20;
int sum = AddNumber( number1, ref number2);
Console.WriteLine(number1); ;
Console.WriteLine(number2);
Console.WriteLine(sum);
Console.ReadKey();
}
public static int AddNumber(int num1, ref int num2)
{
num1 = 100;
num2 = 200;
return num1 + num2;
}
例题1和例题2,只有num2修饰的差别,例题1用的是out修饰,返回值为10,200,300;
例题2用的是ref修饰,返回值为10,200,300;
由此可以看出参数out和ref修饰的差别:
1.如果方法的参数用out或ref修饰时,那么参数在方法外也要用out或ref修饰
2.如果方法的参数用out修饰了,那么在方法外面可以不给这个参数赋值,但是在方法里必须给这个参数赋初值;如果方法用参数ref修饰了,那么在方法里面可以不给这个参数赋值,但是在方法外必须给这个参数赋初值
3.不管是参数是使用out还是ref修饰,都是使参数值按引用传递