C#学习笔记-- 值形参,声明时不带任何修饰符。 引用形参,用 ref 修饰符声明。
? 值形参,声明时不带任何修饰符。 ? 引用形参,用 ref 修饰符声明。
10.6.1.1 值参数
声明时不带修饰符的形参是值形参。一个值形参对应于一个局部变量,只是它的初始值来自该方法调用
所提供的相应实参。
当形参是值形参时,方法调用中的对应实参必须是表达式,并且它的类型可以隐式转换(第 6.1 节)为
形参的类型。
允许方法将新值赋给值参数。这样的赋值只影响由该值形参表示的局部存储位置,而不会影响在方法调
用时由调用方给出的实参。
10.6.1.2 引用参数
引用形参是用 ref 修饰符声明的形参。与值形参不同,引用形参并不创建新的存储位置。相反,引用形
参表示的存储位置恰是在方法调用中作为实参给出的那个变量所表示的存储位置。
当形参为引用形参时,方法调用中的对应实参必须由关键字 ref 并后接一个与形参类型相同的 variable-
reference(第 5.3.3 节)组成。变量在可以作为引用形参传递之前,必须先明确赋值。
在方法内部,引用形参始终被认为是明确赋值的。
声明为迭代器(第 1
0.14 节)的方法不能有引用形参。
下面的示例
using System;
class Test
{
static void Swap(ref int x, ref int y) {
int temp = x;
x = y;
y = temp;
}
static void Main() {
int i = 1, j = 2;
Swap(ref i, ref j);
Console.WriteLine("i = {0}, j = {1}", i, j);
}
}
产生输出
i = 2, j = 1C# LANGUAGE SPECIFICATION
302
版权所有 Microsoft Corporation 1999-2012 。保留所有权利。
对于对 Swap 的调用(在 Main 中),x 表示 i,y 表示 j。因此,该调用具有交换 i 和 j 的值的效果。
在采用引用形参的方法中,多个名称可能表示同一存储位置。在下面的示例中
class A
{
string s;
void F(ref string a, ref string b) {
s = "One";
a = "Two";
b = "Three";
}
void G() {
F(ref s, ref s);
}
}
在 G 中调用 F 时,分别为 a 和 b 传递了一个对 s 的引用。因此,对于该调用,名称 s、a 和 b 全都引用
同一存储位置,并且三个赋值全都修改了同一个实例字段 s。