params与值类型参数修饰符

params与值类型参数修饰符。世家恐怕在编码中或多或少的利用过out的ref,不过是还是不是注意过他两的详细用法以及界别?

1.值类型:

1.值类型:

C# ref、out、params与值类型参数修饰符,

1.值类型:

亚洲必赢官网 1

 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         }

代码

值类型被作为参数时,传递的是值的副本,所以在底下的措施中修改参数的值并不能够影响函数调用中钦赐的参数的值。

理所当然也足以为函数定义重回值从而取得部分想要的结果:

亚洲必赢官网 2

 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):

亚洲必赢官网 3

 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)传递参数,那样函数处理与函数调用中行使的变量正是同1个(因为引用类型参数字传送递的是引用的地方),所以在点子中对那么些变量进行其它修改都会影响用作参数的变量的值。

但通过 ref
修饰符修饰的变量在作为函数的参数字传送递时务必先开端化,不能在函数中开始展览起先化操作。

3.输出类型(out):

亚洲必赢官网 4

 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):

亚洲必赢官网 5

 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
修饰的参数数组,只可以有多个),且这一个参数必须是函数定义中的最终3个参数(即
params 关键字背后不允许出现别的别的参数)。

params
修饰的参数数组不点名参数的数码,唯一的限制正是有所的参数类型必须和参数数组是同类型。

ref、out、params与值类型参数修饰符,
1.值品种: 1 static void Main( string [] args) 2 { 3 int a = 5 ; 4 int
b = 3 ; 5 NumVal(a, b); 6 Console.WriteLine( ” a={0},…

正文想介绍下详细介绍下out参数,ref参数以及一般值参数。

亚洲必赢官网 6亚洲必赢官网 7

亚洲必赢官网 8亚洲必赢官网 9

值参数

在动用参数时,把二个值传递给函数使用的3个变量。在函数中对此变量的其余修改都不影响函数调用中钦点的参数。如上边包车型客车函数,是使函数是使传递过来的参数值加倍,并呈现出来:

 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);

输出到控制台的文件如下所示:

亚洲必赢官网 10

把num作为参数,调用ShowDouble()并不影响米娅n()中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         }
 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);

运维控制台结果如下:

亚洲必赢官网 11

用作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关键字,钦点所给的参数时2个输出参数,out参数和ref参数都在函数定义和函数调用中作为参数的修饰符。事实上,它的实践措施与ref参数大概全盘平等,因为在函数执行达成后,该参数的值将赶回给函数调用中动用的变量。不过,二者存在有的人命关天差异:

1.把未赋值的变量用作ref参数是地下的,但是未赋值的变量能够用作out参数

2.在函数中选取out参数时,必须将其视作尚未赋值。也等于说调用代码能够把已赋值的变量用作out参数,但在函数执行时该变量的值会丢失。

近来后有叁个回来数组中最大值得Max()函数,获取数组中最大值得元素索引(那里如若倘若有五个最大值,只回去第3个最大值索引),添加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);

支配台出口的结果如下所示:

亚洲必赢官网 12

 

值类型被当做参数时,传递的是值的副本,所以在底下的方法中期维修改参数的值并不能够影响函数调用中钦赐的参数的值。

值类型被用作参数时,传递的是值的副本,所以在底下的章程中期维修改参数的值并无法影响函数调用中内定的参数的值。

理所当然也得以为函数定义重临值从而获取部分想要的结果:

本来也得以为函数定义重回值从而获得一些想要的结果:

亚洲必赢官网 13亚洲必赢官网 14

亚洲必赢官网 15亚洲必赢官网 16

 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         }
 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):

2.引用类型(ref):

亚洲必赢官网 17亚洲必赢官网 18

亚洲必赢官网 19亚洲必赢官网 20

 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         }
 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)传递参数,那样函数处理与函数调用中选用的变量正是同二个(因为引用类型参数传递的是引用的地方),所以在艺术中对这么些变量举办别的改动都会影响用作参数的变量的值。

此刻得以因此“引用”参数修饰符(即重点字
ref)传递参数,那样函数处理与函数调用中央银行使的变量便是同三个(因为引用类型参数字传送递的是引用的地方),所以在艺术中对这一个变量举行别的改动都会潜移默化用作参数的变量的值。

但由此 ref
修饰符修饰的变量在作为函数的参数字传送递时必须先起头化,无法在函数中开始展览起头化操作。

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

3.出口类型(out):

3.出口类型(out):

亚洲必赢官网 21亚洲必赢官网 22

亚洲必赢官网 23亚洲必赢官网 24

 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         }
 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 关键字类似,使参数按引用传递值。

out 关键字的采纳方法和 ref 关键字类似,使参数按引用传递值。

差异之处:ref 参数在作为参数字传送递时必须先开端化。out
参数则不要求在传递在此之前初阶化(固然在传递在此以前曾经初叶化,在函数里面也急需再行初叶化,忽略传递在此以前初步化的值),但必须在艺术结束重回以前赋值。

分裂之处:ref 参数在作为参数字传送递时务必先起初化。out
参数则不供给在传递在此以前起首化(固然在传递从前曾经开头化,在函数里面也亟需重新开头化,忽略传递在此以前伊始化的值),但必须在措施甘休重返在此之前赋值。

4.参数数组(params):

4.参数数组(params):

亚洲必赢官网 25亚洲必赢官网 26

亚洲必赢官网 27亚洲必赢官网 28

 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         }
 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
修饰的参数数组,只好有1个),且这些参数必须是函数定义中的最终2个参数(即
params 关键字背后不一样意出现任何其余参数)。

C#中等高校函授数能够钦命多个一定的参数(即 params
修饰的参数数组,只可以有三个),且那么些参数必须是函数定义中的最终三个参数(即
params 关键字背后不容许出现其余别的参数)。

params
修饰的参数数组不钦命参数的数额,唯一的限量正是颇具的参数类型必须和参数数组是同类型。

params
修饰的参数数组不点名参数的数目,唯一的限定就是享有的参数类型必须和参数数组是同类型。

网站地图xml地图