如果为一个参数(形参)附加了ref关键字作为前缀,那么参数就会成为实参的一个别名(或者对实参的一个引用),而不再是实参的一个副本。
使用ref参数时,向参数应用的任何操作,都会同样应用于实参,因为参数(形参)和实参引用的是同一个对象。向一个ref参数传递一个实参时,
实参也必须附加ref关键字作为前缀。
下面给出一个使用了ref关键字的例子:
static void DoWork(ref int param) //使用了ref
{
param++;
}
static void Main()
{
int arg=15;
DoWork(ref arg);
Console.WriteLinr(arg); //将输出16
}
由于DoWork方法传递的是对原始实参的一个引用,而不是传递一个副本,所以使用这个引用进行的任何修改都会反映到原始实参中。因此,输出的是16。
“变量使用前必须赋值”这个规则同样适用于ref参数。 如下例:
static void Dowork(ref int param)
{
param++;
}
static void Main()
{
int arg;
DoWork(ref arg);
Console.WriteLine(arg);
}
其中,arg没有初始化,代码将无法编译,所以出错。因为DoWork中的param++实际上是arg++;而只有当arg有一个已定义的值的时候,arg才是允许的。
而如果用out参数,则可以有方法本身来初始化参数,向其传递一个未初始化的实参。如下例:
static void DoWork(out int param) //使用了ref
{
param=15;
}
static void Main()
{
int arg;
DoWork(out arg);
Console.WriteLine(arg); //将输出16}
ref和out修饰符可以同时应用于引用类型和值类型的参数。效果是完全一样的。参数将成为实参的一个别名。如果使参数重新引用一个新建的对象,那么实际是让实参重新引用新建的对象。