3 本我 1天前 42次点击
迄今定义的所有函数都带有值参数。其含义是:在使用参数时,是把一个值传递给函数使用的一个变量。在函数中对此变量的任何修改都不影响函数调用中指定的参数。例如,下面的函数使传递过来的参数值加倍,并显示出来:
static void 双倍(int val)
{
val *= 2;
WriteLine($"val双倍= {val}");
}
参数val在这个函数中被加倍,如果按以下方式调用它:
int myNumber = 5;
WriteLine($"myNumber = {myNumber}");
双倍(myNumber);
WriteLine($"myNumber = {myNumber}", );
输出到控制台的文本如下所示:
myNumber = 5
val双倍= 10
myNumber = 5
把myNumber作为一个参数,调用双倍()并不影响Main()中myNumber的值,即使把myNumber赋值给val后将val加倍,myNumber的值也不变。
但如果要改变myNumber的值,就会有问题。可以使用一个为myNumber返回新值的函数:
static int 双倍(int val)
{
val *= 2;
return val;
}
并使用下面的代码调用它:
int myNumber = 5;
WriteLine($"myNumber = {myNumber}");
myNumber = 双倍(myNumber);
WriteLine($"myNumber = {myNumber}");
但这段代码一点也不直观,且不能改变用作参数的多个变量值(因为函数只有一个返回值)。
此时可以通过“引用”传递参数。即函数处理的变量与函数调用中使用的变量相同,而不仅仅是值相同的变量。因此,
对这个变量进行的任何改变都会影响用作参数的变量值。为此,只需使用ref关键字指定参数
示例
class Program
{
//定义函数:双倍
static void 双倍(ref int val)
{
val *= 2;
WriteLine($"value双倍={val}");
}
static void Main(string[] args)
{
//声明变量:我的数字
int 我的数字 = 5;
WriteLine($"我的数字={我的数字}");
//调用函数双倍
双倍(ref 我的数字);
WriteLine($"我的数字={我的数字}");
ReadKey();
}
}
用作ref参数的变量有两个限制。首先,函数可能会改变引用参数的值,所以必须在函数调用中使用“非常量”变量。所以,下面的代码是非法的:
const int myNumber = 5;
WriteLine($"myNumber = {myNumber}", );
双倍(ref myNumber);
WriteLine($"myNumber = {myNumber}");
其次,必须使用初始化过的变量。C#不允许假定ref参数在使用它的函数中初始化,下面的代码也是非法的:
int myNumber;
双倍(ref myNumber);
WriteLine("myNumber = {myNumber}");