C# 引用参数和值参数
值参数其含义是:在使用参数时,是把一个值传递给函数所使用的一个变量。在函数中对此变量的任何修改都不影响函数调用中指定的参数。例如,下面的函数使传递过来的参数值加倍,并显示出来:
static void ShowDouble(int val)
{
val *= 2;
WriteLine($"val doubled = {val}");
}
参数val在这个函数中被加倍,如果按以下方式调用它:
int myNumber = 5;
WriteLine($"rmyNumber = {myNumber}");
ShowDouble(myNumber);
WriteLine ($"myNumber = {myNumber}");
输出到控制台的文本如下所示:
myNumber = 5
val doubled = 10
myNumber = 5
把myNumber作为一个参数,调用ShowDouble()并不影响Main()中myNumber的值,即使把myNumber赋值给val后再将val加倍,myNumber的值也不变。
这很不错,但如果要改变myNumber的值,就会有问题。可以使用一个为myNumber返回新值的函数,如下所示;
static int DoubleNum(int val)
{
val *= 2;
return val;
}
并使用下面的代码调用它:
int myNumber = 5;
WriteLine($"myNumber = (myNumber)");
myNumber = DoubleNum(myNumber);
WriteLine($"myNumber = {myNumber}");
但这段代码一点也不直观,且不能改变用作参数的多个变量值(因为函数只有一个返回值)。
此时可以通过“引用”传递参数。即函数处理的变量与函数调用中使用的变量相同,而不仅仅是值相同的变量。因此,对这个变量进行的任何改变都会影响用作参数的变量值。为此,只需要使用ref关键字指定参数:
static void ShowDouble(ref int val)
{
val *= 2;
WriteLine($"val doubled = {val}");
}
在函数调用中再次指定它(这是必需的):
int myNumber = 5;
WriteLine($"myNumber = {myNumber}");
ShowDouble(ref myNumber);
WriteLine($"myNumber = {myNumber)");
输出到控制台的文本现在如下所示:
myNumber = 5
val doubled = 10
myNumber =10
注意,用作ref参数的变量有两个限制。首先,函数可能会改变引用参数的值,所以必须在函数调用中使用“非常量”变量。所以,下面的代码是非法的:
const int myNumber = 5;
WriteLine($"myNumber = {myNumber}");
ShowDouble(ref myNumber);
WriteLine($"myNumber = {myNumber}");
其次,必须使用初始化过的变量。C#不允许假定ref参数在使用它的函数中初始化,下面的代码也是非法的:
int myNumber;
ShowDouble(ref myNumber);
WriteLine<"myNumber = {myNumber)");
到目前为止,只看到了将ref关键字用于函数参数的情况,但也可以将它应用于局部变量和返回值。此处的myNumberRef引用myNumber,修改myNumberRef也会导致myNumber发生变化。如果显示myNumber和myNumberRef的值,则将看到两个变量的值都为6。
int myNumber = 5;
ref int myNumberRef = ref myNumber;
myNumberRef = 6;
也可以将ref关键字用作返回类型。注意以下代码中的ref关键字将返回类型标识为ref int,且代码体中也使用了ref,让函数返回ref val。
static ref int ShowDouble(int val)
{
val *= 2;
return ref val;
}
如果试图编译上面的函数,就会得到一个错误。原因在于通过引用传递参数时,若在变量声明前没有ref关键字,就不能将变量类型作为函数参数传递。查看下面添加了ref关键字的代码段,该函数将通过编译并按预期的那样运行。
static ref int ShowDouble(ref int val)
{
val *= 2;
return ref val;
}
strings和arrays这样的变量是引用类型,在没有参数声明的情况下使用ref关键字可以返回arrays。
static ref int ReturnByRef()
{
int[] array = { 2 };
return ref array[0];
}
点击加载更多评论>>