1.值类型:
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
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 }
值类型被当做参数时,传递的是值的副本,所以在下面的方法中修改参数的值并不能影响函数调用中指定的参数的值。
当然也可以为函数定义返回值从而得到一些想要的结果:
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
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):
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
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):
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
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):
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
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 修饰的参数数组不指定参数的数量,唯一的限制就是所有的参数类型必须和参数数组是同类型。