params与值类型参数修饰符

图片 5

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()并不影响米娅n()中num的值,就算把num值加倍之后再赋值给num,在函数调用完现在num的值依旧不会变。

那也没怎么难点。

params与值类型参数修饰符。唯独只要大家想改正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参数,但在函数实施时该变量的值会错失。

如现在有叁个回去数组中最大值得马克斯(卡塔 尔(英语:State of Qatar)函数,获取数组中最大值得成分索引(这里借使假如有七个最大值,只回去第五个最大值索引卡塔尔国,增加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         }

代码

唯独这么做倒霉的地点正是不能够修改当作参数的多少个变量值。(因为函数独有四个再次回到值卡塔 尔(英语:State of Qatar)。

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         }

代码

那时候得以经过“引用”参数修饰符(即器重字
ref卡塔 尔(英语:State of Qatar)传递参数,那样函数管理与函数调用中采纳的变量便是同二个(因为援用类型参数字传送递的是援用之处卡塔 尔(阿拉伯语:قطر‎,所以在艺术中对那几个变量实行其余更改都会默转潜移用作参数的变量的值。

但因而 ref
修饰符修饰的变量在作为函数的参数字传送递时必得先开端化,无法在函数中开展早先化操作。

3.输出类型(out):

图片 10图片 11

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

代码

out 关键字的选用办法和 ref 关键字雷同,使参数按援用传递值。

差异之处:ref 参数在作为参数字传送递时必需先初步化。out
参数则没有必要在传递以前最早化(就算在传递早前已经初阶化,在函数里面也亟需重新伊始化,忽视传递在此以前开头化的值卡塔尔,但不得不在艺术截止再次来到从前赋值。

4.参数数组(params卡塔尔国:

图片 12图片 13

 1 static void Main(string[] args)
 2         {
 3             int i = 0;
 4             int[] arr = new int[] { 1, 3, 5, 7, 9 };            //可以先定义一个数组对象
 5 
 6             SumVals(ref i, arr);                //然后把这个数组对象作为参数传递
 7 
 8             Console.WriteLine("总共有{0}个元素!", i);         //输出结果为:总共有5个元素!
 9 
10             SumVals(ref i, 2, 4, 6, 8, 0);      //也可以直接调用
11 
12             Console.ReadKey();
13         }
14 
15         static void SumVals(ref int i,params int[] vals)
16         {
17             for (i = 0; i < vals.Length; i++)
18             {
19                 Console.WriteLine("第{0}个元素为:{1}", i + 1, vals[i]);
20             }
21         }

代码

C#中等高校函授数能够内定叁个特定的参数(即 params
修饰的参数数组,只好有三个卡塔 尔(阿拉伯语:قطر‎,且那些参数必得是函数定义中的最终三个参数(即
params 关键字背后不允许出现其余其余参数卡塔尔。

params
修饰的参数数组不钦点参数的多少,唯意气风发的限量正是有着的参数类型必需和参数数组是同类型。

admin

网站地图xml地图