CodeGym /課程 /C# SELF /回傳值與 return 運算子

回傳值與 return 運算子

C# SELF
等級 8 , 課堂 3
開放

1. 前言

想像一下:你打電話訂披薩(或是用 app,畢竟現在都 21 世紀了)。你跟客服說訂單細節,然後客服把結果回給你:披薩!如果客服都沒回應——你就餓肚子,超不爽。

function 也是這樣:有時只是做點事,但很多時候我們希望 function 還能回傳點有用的東西,而且每次輸入不一樣,結果也會不一樣!比如說:

  • function 算兩個數字的總和,然後把結果回傳。
  • function 拿到一個人的年齡,然後回傳分類("小孩"、"大人"、"退休族")。
  • function 幫你組一個漂亮的歡迎字串,根據用戶名字。

回傳值——就是 function 把自己做完的結果「丟」出去的方法啦。

2. 有回傳值的 method 簽名

上一堂課我們有看過這種範本:

void PrintHello()
{
    Console.WriteLine("哈囉!");
}
沒有回傳值的 method( void

void 這個型別意思就是 function 不會回傳東西(void 就是「空的」啦,沒值)。

那我們來看看,有回傳值的 function 長怎樣:

int Add(int a, int b)
{
    // function 內容
}
有回傳值的 method( int

這裡 int 在 function 名字前面,就是回傳值的資料型別。要是 function 回傳字串——就寫 string,回傳小數——就 double,以此類推。

function 宣告語法長這樣:

<回傳值型別> MethodName(<參數>)
{
    // function 內容
}
有回傳值的 method 通用範本

不同簽名的範例:

簽名 回傳什麼
int Sum(int a, int b)
整數
string GetGreeting(string name)
字串
double Multiply(double x, double y)
小數
bool IsAdult(int age)
布林值

3. return 運算子:怎麼從 function 回傳結果

要讓一切順利運作,光寫對型別還不夠——function 還要會把結果「送」回去。這時就要用 return 運算子。它的意思就是:嘿,我要回傳這個值囉,function 執行到這裡就結束(就像「跳出去」一樣)。

型別 MethodName(...)
{
    // 一些運算
    return ;
}
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 可以回傳任何「型別」(不只數字、字串這些經典)。舉幾個例子:

  • 整數: intlongshort——超直觀。
  • 小數: doublefloatdecimal
  • 字串: string
  • 布林: bool
  • 陣列: int[]string[] 等等。
  • 參考型別: 你自己寫的 class 物件。
  • void: 特殊情況,啥都不回傳。

為什麼回傳值型別這麼重要?

compiler 會很嚴格檢查你回傳的東西是不是你承諾的型別。你說要回傳 int,結果給他字串或根本沒給——直接噴錯。超嚴格的主管。

錯誤範例:

int GetNumber()
{
    return "42"; // 錯誤!應該回傳 int,不是 string。
}

6. return 不帶值:for void method

老實說,如果 method 宣告有回傳型別(像 intstring),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);
    }
}
return 不帶值在 void method 裡

這很方便,當你想根據某些條件直接結束 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 裡回傳值!
}
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION