C# 引用參數(shù)和值參數(shù)
值參數(shù)其含義是:在使用參數(shù)時,是把一個值傳遞給函數(shù)所使用的一個變量。在函數(shù)中對此變量的任何修改都不影響函數(shù)調(diào)用中指定的參數(shù)。例如,下面的函數(shù)使傳遞過來的參數(shù)值加倍,并顯示出來:
static void ShowDouble(int val)
{
val *= 2;
WriteLine($"val doubled = {val}");
}
參數(shù)val在這個函數(shù)中被加倍,如果按以下方式調(diào)用它:
int myNumber = 5;
WriteLine($"rmyNumber = {myNumber}");
ShowDouble(myNumber);
WriteLine ($"myNumber = {myNumber}");
輸出到控制臺的文本如下所示:
myNumber = 5
val doubled = 10
myNumber = 5
把myNumber作為一個參數(shù),調(diào)用ShowDouble()并不影響Main()中myNumber的值,即使把myNumber賦值給val后再將val加倍,myNumber的值也不變。
這很不錯,但如果要改變myNumber的值,就會有問題??梢允褂靡粋€為myNumber返回新值的函數(shù),如下所示;
static int DoubleNum(int val)
{
val *= 2;
return val;
}
并使用下面的代碼調(diào)用它:
int myNumber = 5;
WriteLine($"myNumber = (myNumber)");
myNumber = DoubleNum(myNumber);
WriteLine($"myNumber = {myNumber}");
但這段代碼一點(diǎn)也不直觀,且不能改變用作參數(shù)的多個變量值(因?yàn)楹瘮?shù)只有一個返回值)。
此時可以通過“引用”傳遞參數(shù)。即函數(shù)處理的變量與函數(shù)調(diào)用中使用的變量相同,而不僅僅是值相同的變量。因此,對這個變量進(jìn)行的任何改變都會影響用作參數(shù)的變量值。為此,只需要使用ref關(guān)鍵字指定參數(shù):
static void ShowDouble(ref int val)
{
val *= 2;
WriteLine($"val doubled = {val}");
}
在函數(shù)調(diào)用中再次指定它(這是必需的):
int myNumber = 5;
WriteLine($"myNumber = {myNumber}");
ShowDouble(ref myNumber);
WriteLine($"myNumber = {myNumber)");
輸出到控制臺的文本現(xiàn)在如下所示:
myNumber = 5
val doubled = 10
myNumber =10
注意,用作ref參數(shù)的變量有兩個限制。首先,函數(shù)可能會改變引用參數(shù)的值,所以必須在函數(shù)調(diào)用中使用“非常量”變量。所以,下面的代碼是非法的:
const int myNumber = 5;
WriteLine($"myNumber = {myNumber}");
ShowDouble(ref myNumber);
WriteLine($"myNumber = {myNumber}");
其次,必須使用初始化過的變量。C#不允許假定ref參數(shù)在使用它的函數(shù)中初始化,下面的代碼也是非法的:
int myNumber;
ShowDouble(ref myNumber);
WriteLine<"myNumber = {myNumber)");
到目前為止,只看到了將ref關(guān)鍵字用于函數(shù)參數(shù)的情況,但也可以將它應(yīng)用于局部變量和返回值。此處的myNumberRef引用myNumber,修改myNumberRef也會導(dǎo)致myNumber發(fā)生變化。如果顯示myNumber和myNumberRef的值,則將看到兩個變量的值都為6。
int myNumber = 5;
ref int myNumberRef = ref myNumber;
myNumberRef = 6;
也可以將ref關(guān)鍵字用作返回類型。注意以下代碼中的ref關(guān)鍵字將返回類型標(biāo)識為ref int,且代碼體中也使用了ref,讓函數(shù)返回ref val。
static ref int ShowDouble(int val)
{
val *= 2;
return ref val;
}
如果試圖編譯上面的函數(shù),就會得到一個錯誤。原因在于通過引用傳遞參數(shù)時,若在變量聲明前沒有ref關(guān)鍵字,就不能將變量類型作為函數(shù)參數(shù)傳遞。查看下面添加了ref關(guān)鍵字的代碼段,該函數(shù)將通過編譯并按預(yù)期的那樣運(yùn)行。
static ref int ShowDouble(ref int val)
{
val *= 2;
return ref val;
}
strings和arrays這樣的變量是引用類型,在沒有參數(shù)聲明的情況下使用ref關(guān)鍵字可以返回arrays。
static ref int ReturnByRef()
{
int[] array = { 2 };
return ref array[0];
}
點(diǎn)擊加載更多評論>>