(C#)方法的参数修饰符
参数修饰符
(无) 如果一个参数没有修饰符标记,则认为它将按值传递(pass by value),这意味着被调用的方法收到一份原始数据的副本。
out 输出参数由被调用的方法赋值,因此它按引用传递(pass by reference),如果被调用的方法没有给输出参数赋值,就会出现编译器错误。
ref 调用者赋初值,可以由被调用的方法可选的重新赋值(数据也是按引用传递),如果被调用的方法未能给ref参数赋值,也不会有编译器错误。
params 允许将一组可变数量的参数作为单独的逻辑参数进行传递。方法只能有一个params参数,并且必须是方法的最后一个参数。
默认的参数传递行为 - 副本传入,按值传递
如果没有为参数标记参数相关的修饰符,数据的副本就会被传入函数。
namespace ConsoleApplication1 { class Program { // 静态方法可以被直接调用(无需对象实例化) static int Add(int x, int y) { int sum = x + y; // 调用者传入的是x,y的副本,所以下面的改变不会影响调用者中的x,y值。 x = 2013; y = 213; return sum; } static void Main(string[] args) { int x = 8, y = 18; Console.WriteLine("Sum of {0} and {1} is: {2}", x, y, Add(x, y)); //Output: 8, 18, 26 Console.WriteLine("After call, x is {0}, y is {1}", x, y); //Output: 8, 18 Console.ReadLine(); } } }
out 修饰符 -输出参数,按引用传值
带有输出参数(out)的方法在退出方法之前,给参数附一个恰当的值。(否则会产生编译器错误)
namespace ConsoleApplication1 { class Program { // 输出参数sum由如下被调用的方法赋值, 本方法无需返回值。 static void Add(int x, int y, out int sum) { sum = x + y; } static void Main(string[] args) { int x = 8, y = 18; // 无需给输出参数赋初始值。 int sum; Add(x, y, out sum); Console.WriteLine("Sum of {0} and {1} is: {2}", x, y, sum); //Output: 8, 18, 26 Console.ReadLine(); } } }
out修饰符有个很好的用途:通过它,调用者只使用一次方法就可以获取多个返回值。
namespace ConsoleApplication1 { class Program { // 设置多个输出参数 static void SimpleMath(int x, int y, out int sum, out int subtract) { sum = x + y; subtract = x - y; } static void Main(string[] args) { int myX = 8, myY = 18; // 无需给输出参数赋初始值。 int mySum, mySubtract; SimpleMath(myX, myY, out mySum, out mySubtract); Console.WriteLine("Sum of {0} and {1} is: {2}, Subtract is {3}", myX, myY, mySum, mySubtract); //Output: 8, 18, 26, -10 Console.ReadLine(); } } }
ref 修饰符 - 引用参数,按引用传值
通过使用引用参数,方法可以对在调用者作用域中声明的不同数据进行操作(改变值),例如排序和交换。
引用参数(ref修饰)和输出参数(out修饰)的区别在于:
- 输出参数不需要它们在被传递给方法之前初始化,方法在退出之前必须为输出参数赋值。
- 引用参数必须在它们被传递给方法之前初始化,因为是传递一个对已存变量的引用。
namespace ConsoleApplication1 { class Program { // 设置引用参数 static void Swap(ref int x, ref int y) { int temp = x; x = y; y = temp; } static void Main(string[] args) { // 必须给引用参数赋初始值。 int myX = 8, myY = 18; Console.WriteLine("Before: myX is {0}, myY is {1}", myX, myY); //Output: 8, 18 Swap(ref myX, ref myY); Console.WriteLine("After: myX is {0}, myY is {1}", myX, myY); //Output: 18, 8 Console.ReadLine(); } } }