云在青天部落阁

独学而无友,则孤陋而寡闻。做一个灵魂有趣的人!
扩大
缩小

C#的params、ref、out关键字

  • [ref关键字]

    一般的方法调用---值参数


    值参数:在使用参数时,是把一个值传递给函数。在函数中,对此变量的任何修改都不影响函数调用中使用的参数。

    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关键字:指定所给的参数是一个输出参数,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编辑  收藏  举报

导航