C#的params、ref、out关键字
-
一般的方法调用---值参数
值参数:在使用参数时,是把一个值传递给函数。在函数中,对此变量的任何修改都不影响函数调用中使用的参数。static void showDouble(int val)
{
val*=2;
WriteLine($"val doubled ={val}");
}参数在val在这个函数中被加倍,如果在Main函数中按如下方式调用它:
int myNumber = 5;
WriteLine($"myNumber = {myNumber}")
ShowDouble(myNumber);
WriteLine($"myNumber = {myNumber}")控制台输出:
myNumber = 5;
val doubled = 10;
myNumber = 5;把myNumber作为一个参数,调用ShowDouble并不影响Main()中myNumber的值,即使把myNumber赋值给val后再将val加倍,myNumber的值也不变;如果我想改变myNumber的值,该方法调用,就满足不了需求了,因此传统的做法是,使用一个为myNumber返回新值的函数。如下:
使用一个为myNumber返回新值的函数
static int DoubleNum(int val)
{
val*=2;
return val;
}
在Main函数中按如下方式调用它:
int myNumber = 5;
WriteLine($"myNumber = {myNumber}")
myNumber = DoubleNum(myNumber);
WriteLine($"myNumber = {myNumber}")
虽然这段代码为myNumber返回了新值,但不能改变用作参数的多个变量值(函数只有一个返回值),下面为进一步解决问题需求:可以通过“引用传递参数”,即函数处理的变量和函数调用中使用的变量相同,而不仅仅是值相同的变量,对这个变量进行任何的改变都会影响用作参数的变量值。
引入ref关键字---用途一:用作函数参数
static void showDouble(ref int val)
{
val*=2;
WriteLine($"val doubled ={val}");
}
在Main函数中按如下方式调用它:
int myNumber = 5;
WriteLine($"myNumber = {myNumber}")
showDouble(ref myNumber);
WriteLine($"myNumber = {myNumber}")
注意点:用作ref参数的变量有两个限制:一,要是非常量的变量;二,要是初始化过的变量
引入ref关键字---用途二:用作局部变量
int myNumber = 5;
ref int myNumberRef = ref myNumber;
myNumberRef = 6;
此处的myNumberRef引用myNumber,修改myNumberRef也会导致myNumgber发生变化;即将看到两个变量的值都为6
引入ref关键字---用途二:用作返回类型
static ref int showDouble(ref int val)
{
val*=2;
return ref val;
}
-
一般的方法调用---值参数
out关键字:指定所给的参数是一个输出参数,out关键字的使用方式与ref关键字相同(在函数调用和函数定义中用作参数的修饰符),在函数执行完毕后,该参数的值将返回给函数调用中使用的变量;
与ref关键字的区别:
把未赋值的变量用作ref参数是非法的,但可以把未赋值的变量用作out参数;在函数使用out参数时,必须把它看作尚未赋值。
即调用代码可以把已赋值的变量用作out参数,但存储在该变量的中保存的值会在函数执行时丢失。需求:返回数组中最大的值的maxValue()函数,并获取数组中最大值的元素索引,如果数组中有多个元素的值都是这个最大值,只提取第一个最大值的索引,代码如下所示:
static int MaxValue(int[] intArray,out int maxIndex)
{
int maxVal = intArray[0];
maxIndex = 0;
for(int i=1;i<intArray.Length;i++)
{
if(intArray[i]>maxVal)
{
maxVal = intArray[i];
maxIndex = i;
}
}
return maxVal;
}
Main函数中:
int[] myArray ={1,3,5,9,6,4,7}
WriteLine("value is "+$"{MaxValue(myArray,out int maxIndex)}")
WriteLine("index is"+$"{maxIndex+1}");
还可参考:https://www.cnblogs.com/chenwolong/p/ref.html
https://www.cnblogs.com/GreenLeaves/p/6843026.html
https://www.cnblogs.com/vinsonLu/p/3664364.html
posted on 2019-08-20 19:48 NoMatterTryAgain 阅读(149) 评论(0) 编辑 收藏 举报