值类型变量直接包含其数据,这与引用类型变量不同,后者包含对其数据的引用。因此,向方法传递值类型变量意味着向方法传递变量的一个副本。方法内发生的对参数的更改对该变量中存储的原始数据无任何影响。如果希望所调用的方法更改参数的值,必须使用 ref 或 out 关键字通过引用传递该参数。为了简单起见,下面的示例使用 ref。
示例:通过值传递值类型
下面的示例演示通过值传递值类型参数。通过值将变量 n
传递给方法 SquareIt
。方法内发生的任何更改对变量的原始值无任何影响。
C# | ![]() |
---|---|
class PassingValByVal { static void SquareIt(int x) // The parameter x is passed by value. // Changes to x will not affect the original value of x. { x *= x; System.Console.WriteLine("The value inside the method: {0}", x); } static void Main() { int n = 5; System.Console.WriteLine("The value before calling the method: {0}", n); SquareIt(n); // Passing the variable by value. System.Console.WriteLine("The value after calling the method: {0}", n); } } |
输出
The value before calling the method: 5
The value inside the method: 25
The value after calling the method: 5
代码讨论
变量 n
为值类型,包含其数据(值为 5
)。当调用 SquareIt
时,n
的内容被复制到参数 x
中,在方法内将该参数求平方。但在 Main
中,n
的值在调用 SquareIt
方法前后是相同的。实际上,方法内发生的更改只影响局部变量 x
。
示例:通过引用传递值类型
下面的示例除使用 ref 关键字传递参数以外,其余与上一示例相同。参数的值在调用方法后发生更改。
C# | ![]() |
---|---|
class PassingValByRef { static void SquareIt(ref int x) // The parameter x is passed by reference. // Changes to x will affect the original value of x. { x *= x; System.Console.WriteLine("The value inside the method: {0}", x); } static void Main() { int n = 5; System.Console.WriteLine("The value before calling the method: {0}", n); SquareIt(ref n); // Passing the variable by reference. System.Console.WriteLine("The value after calling the method: {0}", n); } } |
输出
The value before calling the method: 5
The value inside the method: 25
The value after calling the method: 25
代码讨论
本示例中,传递的不是 n
的值,而是对 n
的引用。参数 x
不是 int 类型,它是对 int 的引用(本例中为对 n
的引用)。因此,当在方法内对 x
求平方时,实际被求平方的是 x
所引用的项:n
。
示例:交换值类型
更改所传递参数的值的常见示例是 Swap
方法,在该方法中传递 x
和 y
两个变量,然后使方法交换它们的内容。必须通过引用向 Swap
方法传递参数;否则,方法内所处理的将是参数的本地副本。以下是使用引用参数的 Swap
方法的示例:
C# | ![]() |
---|---|
static void SwapByRef(ref int x, ref int y) { int temp = x; x = y; y = temp; } |
调用该方法时,请在调用中使用 ref 关键字,如下所示:
C# | ![]() |
---|---|
static void Main() { int i = 2, j = 3; System.Console.WriteLine("i = {0} j = {1}" , i, j); SwapByRef (ref i, ref j); System.Console.WriteLine("i = {0} j = {1}" , i, j); } |
输出
i = 2 j = 3
i = 3 j = 2
请参见
