params与值类型参数修饰符ca88会员登录中心

ca88会员登录中心 7
ca88会员登录中心

大家可能在编码中或多或少的使用过out的ref,但是是否注意过他两的详细用法以及区别?

1.值类型:

1.值类型:

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

ca88会员登录中心 1ca88会员登录中心 2

ca88会员登录中心 3ca88会员登录中心 4

值参数

在使用参数时,把一个值传递给函数使用的一个变量。在函数中对此变量的任何修改都不影响函数调用中指定的参数。如下面的函数,是使函数是使传递过来的参数值加倍,并显示出来:

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

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

ca88会员登录中心 5

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

运行控制台结果如下:

ca88会员登录中心 6

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

控制台输出的结果如下所示:

ca88会员登录中心 7

 

值类型被当做参数时,传递的是值的副本,所以在下面的方法中修改参数的值并不能影响函数调用中指定的参数的值。

值类型被当做参数时,传递的是值的副本,所以在下面的方法中修改参数的值并不能影响函数调用中指定的参数的值。

当然也可以为函数定义返回值从而得到一些想要的结果:

当然也可以为函数定义返回值从而得到一些想要的结果:

ca88会员登录中心 8ca88会员登录中心 9

ca88会员登录中心 10ca88会员登录中心 11

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

ca88会员登录中心 12ca88会员登录中心 13

ca88会员登录中心 14ca88会员登录中心 15

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

ca88会员登录中心 16ca88会员登录中心 17

ca88会员登录中心 18ca88会员登录中心 19

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

ca88会员登录中心 20ca88会员登录中心 21

ca88会员登录中心 22ca88会员登录中心 23

 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
修饰的参数数组,只能有一个),且这个参数必须是函数定义中的最后一个参数(即
params 关键字后面不允许出现任何其他参数)。

C#中函数可以指定一个特定的参数(即 params
修饰的参数数组,只能有一个),且这个参数必须是函数定义中的最后一个参数(即
params 关键字后面不允许出现任何其他参数)。

ca88会员登录中心,params
修饰的参数数组不指定参数的数量,唯一的限制就是所有的参数类型必须和参数数组是同类型。

params
修饰的参数数组不指定参数的数量,唯一的限制就是所有的参数类型必须和参数数组是同类型。

发表评论

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

网站地图xml地图