1. 前言
想像一下:你打電話訂披薩(或是用 app,畢竟現在都 21 世紀了)。你跟客服說訂單細節,然後客服把結果回給你:披薩!如果客服都沒回應——你就餓肚子,超不爽。
function 也是這樣:有時只是做點事,但很多時候我們希望 function 還能回傳點有用的東西,而且每次輸入不一樣,結果也會不一樣!比如說:
- function 算兩個數字的總和,然後把結果回傳。
- function 拿到一個人的年齡,然後回傳分類("小孩"、"大人"、"退休族")。
- function 幫你組一個漂亮的歡迎字串,根據用戶名字。
回傳值——就是 function 把自己做完的結果「丟」出去的方法啦。
2. 有回傳值的 method 簽名
上一堂課我們有看過這種範本:
void PrintHello()
{
Console.WriteLine("哈囉!");
}
void 這個型別意思就是 function 不會回傳東西(void 就是「空的」啦,沒值)。
那我們來看看,有回傳值的 function 長怎樣:
int Add(int a, int b)
{
// function 內容
}
這裡 int 在 function 名字前面,就是回傳值的資料型別。要是 function 回傳字串——就寫 string,回傳小數——就 double,以此類推。
function 宣告語法長這樣:
<回傳值型別> MethodName(<參數>)
{
// function 內容
}
不同簽名的範例:
| 簽名 | 回傳什麼 |
|---|---|
|
整數 |
|
字串 |
|
小數 |
|
布林值 |
3. return 運算子:怎麼從 function 回傳結果
要讓一切順利運作,光寫對型別還不夠——function 還要會把結果「送」回去。這時就要用 return 運算子。它的意思就是:嘿,我要回傳這個值囉,function 執行到這裡就結束(就像「跳出去」一樣)。
型別 MethodName(...)
{
// 一些運算
return 值;
}
範例:
int Add(int a, int b)
{
int sum = a + b;
return sum; // 把 sum 當作 function 結果回傳
}
重要規則:透過 return 回傳的值型別,要跟你在 method 簽名寫的一模一樣(或至少相容)。
4. 範例:寫會回傳東西的 method
直接來看範例!幾個常見情境:
範例 1:兩數相加
int Add(int a, int b)
{
return a + b;
}
// 用法:
int result = Add(10, 20);
Console.WriteLine("總和: " + result); // 輸出: 總和: 30
範例 2:個人化歡迎詞
string CreateGreeting(string name)
{
return "哈囉, " + name + "!";
}
// 用法:
string greeting = CreateGreeting("安娜");
Console.WriteLine(greeting); // 輸出: 哈囉, 安娜!
範例 3:成年檢查
bool IsAdult(int age)
{
return age >= 18;
}
if (IsAdult(21))
{
Console.WriteLine("可以進場。");
}
else
{
Console.WriteLine("抱歉,只限大人。");
}
// 輸出: 可以進場。
範例 4:回傳值直接用在運算式裡
Console.WriteLine("兩倍: " + MultiplyByTwo(7));
int MultiplyByTwo(int n)
{
return n * 2;
}
5. 回傳值型別:多元又有趣
在 C# 裡,function 可以回傳任何「型別」(不只數字、字串這些經典)。舉幾個例子:
- 整數: int、long、short——超直觀。
- 小數: double、float、decimal。
- 字串: string。
- 布林: bool。
- 陣列: int[]、string[] 等等。
- 參考型別: 你自己寫的 class 物件。
- void: 特殊情況,啥都不回傳。
為什麼回傳值型別這麼重要?
compiler 會很嚴格檢查你回傳的東西是不是你承諾的型別。你說要回傳 int,結果給他字串或根本沒給——直接噴錯。超嚴格的主管。
錯誤範例:
int GetNumber()
{
return "42"; // 錯誤!應該回傳 int,不是 string。
}
6. return 不帶值:for void method
老實說,如果 method 宣告有回傳型別(像 int、string),return 一定要帶你要回傳的值。
但!如果 function 宣告是 void,你還是可以用 return(不帶值)——這樣會直接結束 function 執行。
void PrintNumbers(int n)
{
if (n <= 0)
{
Console.WriteLine("數字不能是負的!");
return; // 直接跳出 function,啥都不回傳
}
for (int i = 1; i <= n; i++)
{
Console.WriteLine(i);
}
}
這很方便,當你想根據某些條件直接結束 function,但又不需要回傳東西時。
7. 用 return 常見錯誤
新手常常會被 return 搞到頭痛!
問題 1:該回傳卻沒 return
int GetValue(bool flag)
{
if (flag)
return 1;
// 哎呀!如果 flag == false 呢?
}
// 錯誤:不是所有路徑都有 return!
解法:所有情境都要有 return!比如:
int GetValue(bool flag)
{
if (flag)
return 1;
else
return 0;
}
問題 2:回傳值型別不對
double GetMagicNumber()
{
return 42; // 這樣其實 OK(int 會自動轉 double)
// 但如果 function 要回傳 int,你卻回傳字串——就會錯!
}
規則:型別要相容。有疑慮就自己轉型:
return (double)42;
問題 3:return 太早
記住,只要執行到 return,method 立刻結束。後面寫啥都不會執行!
int GetNumber()
{
return 5;
Console.WriteLine("這行永遠不會被執行"); // compiler 會直接罵你!
}
問題 4:void method 裡 return 帶值(禁止!)
void PrintSomething()
{
return 1; // 不能在 void method 裡回傳值!
}
GO TO FULL VERSION