C# 定義和使用函數(shù)—返回值
通過函數(shù)進(jìn)行數(shù)據(jù)交換的最簡單方式是利用返回值。有返回值的函數(shù)會(huì)最終計(jì)算得到這個(gè)值,就像在表達(dá)式中使用變量時(shí),會(huì)計(jì)算得到變量包含的值一樣。與變量一樣,返回值也有數(shù)據(jù)類型。
例如,有一個(gè)函數(shù)GetStringO,其返回值是一個(gè)字符串,可在代碼中使用該函數(shù),如下所示:
string myString;
myString = GetString();
還有一個(gè)函數(shù)GetValO,它返回一個(gè)double值,可在數(shù)學(xué)表達(dá)式中使用它:
double myVal;
double multiplier = 5.3;
myVal = GetVal() * multiplier;
當(dāng)函數(shù)返回一個(gè)值時(shí),必須采用以下兩種方式修改函數(shù):
?在函數(shù)聲明中指定返回值的類型,但不使用關(guān)鍵字void。
?使用return關(guān)鍵字結(jié)束函數(shù)的執(zhí)行,把返回值傳送給調(diào)用代碼。
從代碼角度看,對(duì)于我們討論的控制臺(tái)應(yīng)用程序函數(shù),其使用返回值的形式如下所示:
static <returnType> <FunctionName>()
{
...
return <returnVa1ue>;
}
這里唯一的限制是<returnType>必須是<returnType>類型的值,或者可以隱式轉(zhuǎn)換為該類型。但是,可以是任何類型,包括前面介紹的較復(fù)雜類型。這段代碼可以很簡單:
static double GetVal()
{
return 3.2;
}
但是,返回值通常是函數(shù)執(zhí)行的一些處理的結(jié)果。上面的結(jié)果使用const變量也可以簡單地實(shí)現(xiàn)。
當(dāng)執(zhí)行到return語句時(shí),程序會(huì)立即返回調(diào)用代碼。這條語句后面的代碼都不會(huì)執(zhí)行。但這并不意味著return語句只能放在函數(shù)體的最后一行??梢栽谇斑叺拇a里使用return語句,例如放在分支邏輯之后。把return語句放在for循環(huán)、if塊或其他結(jié)構(gòu)中會(huì)使該結(jié)構(gòu)立即終止,函數(shù)也立即終止。例如:
static double GetVal()
{
double checkVal;
// cheGkVal assigned a value through some logic (not shown here).
if (checkVal < 5)
return 4.7;
return 3.2;
}
根據(jù)checkVal的值,將返回兩個(gè)值中的一個(gè)。這里的唯一限制是,必須在函數(shù)的閉合花括號(hào)}之前處理 return 語句。下面的代碼是不合法的:
static double GetVal()
{
double checkVal;
// checkVal assigned a value through some logic.
if (checkVal < 5)
return 4,7;
}
如果checkVal>= 5,就不會(huì)執(zhí)行到return語句,這是不允許的。所有處理路徑都必須執(zhí)行到return語句。大多數(shù)情況下,編譯器會(huì)檢查是否執(zhí)行到return語句,如果沒有,就給出錯(cuò)誤“并不是所有的處理路徑都返回一個(gè)值”。
執(zhí)行一行代碼的函數(shù)可使用C# 6引入的一個(gè)功能:表達(dá)式體方法(expression-bodied method)。以下函數(shù)模式使用=>(Lambda箭頭)來實(shí)現(xiàn)這一功能。
static <returnType> <FunctionName>() => <myVall * myVal2>;
例如,C#6之前的Multip]〆)函數(shù)如下:
static double Multiply(double myVail, double myVal2)
{
return myVail * myVal2;
}
現(xiàn)在可以使用=>(Lambda箭頭)編寫它。下述代碼用更簡單和統(tǒng)一的方式表達(dá)方法的意圖:
static double Multiply(double myVall, double myVa12) => mVall * MyVal2;
點(diǎn)擊加載更多評(píng)論>>