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