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