威尼斯人线上娱乐

params与值类型参数修饰符

29 3月 , 2019  

大家也许在编码中或多或少的施用过out的ref,可是是还是不是注意过他两的详尽用法以及界别?

1.值类型:

params与值类型参数修饰符。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个重回值)。

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

但通过 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
修饰的参数数组,只可以有一个),且这一个参数必须是函数定义中的最后四个参数(即
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个值传递给函数使用的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);

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

威尼斯人线上娱乐 10

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

那段代码不是很直观,且不可能改变当做参数的多少个变量值(因为函数唯有1个重返值)。那几个时候大家得以想到引用参数,即函数处理的变量和函数调用的变量相同,而不仅仅是值相同的变量。由此对这几个变量的其余变更都会潜移默化用作参数的变量值。为此,大家接纳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关键字,钦赐所给的参数时二个输出参数,out参数和ref参数都在函数定义和函数调用中作为参数的修饰符。事实上,它的实践办法与ref参数差不离完全一样,因为在函数执行完结后,该参数的值将回来给函数调用中动用的变量。然则,二者存在有的第①不相同:

1.把未赋值的变量用作ref参数是不法的,可是未赋值的变量可以用作out参数

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

如未来有1个赶回数组中最大值得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);

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

威尼斯人线上娱乐 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         }

代码

代码

唯独如此做倒霉的地点就是不可能更改当做参数的八个变量值。(因为函数只有1个重返值)。

然则那样做不佳的地点正是不可能更改当做参数的多个变量值。(因为函数唯有1个再次回到值)。

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)传递参数,那样函数处理与函数调用中动用的变量即是同3个(因为引用类型参数字传送递的是援引的地址),所以在点子中对这些变量实行任何改动都会影响用作参数的变量的值。

那时能够通过“引用”参数修饰符(即重点字
ref)传递参数,那样函数处理与函数调用中利用的变量就是同3个(因为引用类型参数字传送递的是引用的地址),所以在艺术中对那个变量实行别的修改都会影响用作参数的变量的值。

但由此 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#中等学校函授数能够钦命2个特定的参数(即 params
修饰的参数数组,只可以有一个),且这么些参数必须是函数定义中的最终多个参数(即
params 关键字背后不容许出现任何别的参数)。

威尼斯人线上娱乐 ,C#中等高校函授数能够钦点三个特定的参数(即 params
修饰的参数数组,只好有二个),且这一个参数必须是函数定义中的最终一个参数(即
params 关键字背后不允许出现其余别的参数)。

params
修饰的参数数组不点名参数的数目,唯一的范围正是负有的参数类型必须和参数数组是同类型。

params
修饰的参数数组不钦赐参数的数目,唯一的限制就是有着的参数类型必须和参数数组是同类型。


相关文章

发表评论

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

网站地图xml地图