位置:首页 > 软件操作教程 > 编程开发 > C# > 问题详情

C# 引用参数和值参数

提问人:刘团圆发布时间:2020-12-04

    值参数其含义是:在使用参数时,是把一个值传递给函数所使用的一个变量。在函数中对此变量的任何修改都不影响函数调用中指定的参数。例如,下面的函数使传递过来的参数值加倍,并显示出来:

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];

}

继续查找其他问题的答案?

相关视频回答
回复(0)
返回顶部