引用参数和值参数

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}");


目前还没有评论
添加一条新评论

登录后可以发表评论 去登录

作者

积分:373

这家伙很懒,什么都没有留下