params与值类型参数修饰符

大家大概在编码中或多或少的利用过out的ref,然则是或不是注意过他两的亲力亲为用法甚至界别?

1.值类型:

正文想介绍下详细介绍下out参数,ref参数以至平时值参数。

官方澳门新永利下载 1官方澳门新永利下载 2

值参数

在行使参数时,把贰个值传递给函数使用的叁个变量。在函数中对此变量的其余改过都不影响函数调用中钦命的参数。如上边包车型客车函数,是使函数是使传递过来的参数值加倍,并彰显出来:

 static void ShowDouble(int num)
        {
            num = num * 2;
            Console.WriteLine("num*2={0}", num);
        }

参数num在函数中被加倍,假使按以下格局调用它:

            int num = 5;
            Console.WriteLine("num={0}", num);
            ShowDouble(num);
            Console.WriteLine("num={0}", num);

输出到调节台的文本如下所示:

官方澳门新永利下载 3

把num作为参数,调用ShowDouble(卡塔尔(قطر‎并不影响Mian(卡塔尔中num的值,尽管把num值加倍之后再赋值给num,在函数调用完之后num的值照旧不会变。

这也没怎么难点。

只是假使大家想校勘num的值吗?大家会想到利用为num重返新值的函数:

 static int DoubleNum(int num)
        {
            num = num * 2;
            return num;
        }

然后调用:

            int num = 5;
            Console.WriteLine("num={0}", num);
            num = DoubleNum(num);
            Console.WriteLine("num={0}", num);

这段代码不是很直观,且无法更正当作参数的多少个变量值(因为函数唯有一个重临值)。此时我们得以想到援引参数,即函数管理的变量和函数调用的变量相像,而不光是值相符的变量。由此对那一个变量的其它变动都会潜移暗化用作参数的变量值。为此,大家使用ref关键词钦定参数。

 1 static void Main(string[] args)
 2         {
 3             int a = 5;
 4             int b = 3;
 5             NumVal(a, b);
 6             Console.WriteLine("a={0},b={1}", a, b);     //输出结果为:a=5,b=3
 7 
 8             Console.ReadKey();
 9         }
10 
11 
12         static void NumVal(int a, int b)
13         {
14             a = a + b;
15             b = a - b;
16         }

ref参数

            int num = 5;
            Console.WriteLine("num={0}", num);
            ShowDouble(ref num);
            Console.WriteLine("num={0}", num);

官方澳门新永利下载,运转调节台结果如下:

官方澳门新永利下载 4

用作ref的参数的变量有五个节制:

1.函数只怕会变动引用参数的值,所以必得在函数调用中选取“非常量”变量,所以上边包车型大巴代码是不被允许的:

 

            const int num = 5;
            Console.WriteLine("num={0}", num);
            ShowDouble(ref num);
            Console.WriteLine("num={0}", num);

2.不得不运用领头化过的变量。C#不容许假定ref参数在函数调用时初步化,下边包车型客车代码也是不被允许的:

            int num;
            Console.WriteLine("num={0}", num);
            ShowDouble(ref num);
            Console.WriteLine("num={0}", num);

代码

输出参数(out)

除此之外ref外,还是能钦赐out关键字,钦赐所给的参数时八个出口参数,out参数和ref参数都在函数定义和函数调用中作为参数的修饰符。事实上,它的实行措施与ref参数差不离统统平等,因为在函数施行完成后,该参数的值将回来给函数调用中利用的变量。不过,二者存在一些最主要差别:

1.把未赋值的变量用作ref参数是非法的,可是未赋值的变量能够用作out参数

2.在函数中运用out参数时,必需将其看做还未赋值。也正是说调用代码能够把已赋值的变量用作out参数,但在函数试行时该变量的值会遗失。

如现在有八个回到数组中最大值得Max()函数,获取数组中最大值得成分索引(这里借使即使有八个最大值,只回去第三个最大值索引),加多out参数:

  static int Max(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;
        }

调用下边包车型客车代码:

 int[] myArray = { 1, 8, 3, 6, 2, 5, 9, 3, 0, 2 };
 int maxIndex;
 Console.WriteLine("the maxium value is {0}", Max(myArray, out maxIndex));
 Console.WriteLine("the index of the maxium value is{0}", maxIndex + 1);

决定台出口的结果如下所示:

官方澳门新永利下载 5

 

值类型被充任参数时,传递的是值的别本,所以在上面包车型大巴办法中期维改良参数的值并无法影响函数调用中钦定的参数的值。

理所必然也足认为函数定义重回值进而获取部分想要的结果:

官方澳门新永利下载 6官方澳门新永利下载 7

 1 static void Main(string[] args)
 2         {
 3             int a = 5;
 4             int b = 3;
 5             int num1 = NumVal(a, b);
 6             int num2 = NumValC(a, b);
 7             Console.WriteLine("a={0},b={1}", num1, num2);     //输出结果为:a=8,b=2
 8 
 9             Console.ReadKey();
10         }
11 
12         static int NumVal(int a, int b)
13         {
14             a = a + b;
15             return a;
16         }
17 
18         static int NumValC(int a, int b)
19         {
20             b = a - b;
21             return b;
22         }

代码

然而那样做不佳的地点正是不可能校勘当作参数的多个变量值。(因为函数唯有多个再次来到值)。

2.援用类型(ref):

官方澳门新永利下载 8官方澳门新永利下载 9

 1 static void Main(string[] args)
 2         {
 3             int a = 5;
 4             int b = 3;
 5             NumVal(ref a, ref b);
 6             Console.WriteLine("a={0},b={1}", a, b);     //输出结果为:a=8,b=2
 7 
 8             Console.ReadKey();
 9         }
10 
11         static void NumVal(ref int a, ref int b)
12         {
13             int c = a;      // c=5
14             a = a + b;      // a=5+3
15             b = c - b;      // b=5-3
16         }

代码

发表评论

电子邮件地址不会被公开。 必填项已用*标注