位置:首頁(yè) > 軟件操作教程 > 編程開(kāi)發(fā) > C# > 問(wèn)題詳情

C# 引用參數(shù)和值參數(shù)

提問(wèn)人:劉團(tuán)圓發(fā)布時(shí)間:2020-12-04

    值參數(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)題的答案?

相關(guān)視頻回答
回復(fù)(0)
返回頂部