第 5 課 · 約 12 分鐘 · ← 第 4 課
方法:給菜譜起名字
方法是一段有名字的程式碼塊,帶輸入(引數),通常有一個輸出(返回值)。菜譜寫一次,處處可用。
return:回答問題的方法
int Add(int a, int b)
{
return a + b; // 把這個值交還給呼叫方
}
Console.WriteLine(Add(3, 4));
簽名從左往右讀:int(返回什麼)Add(叫什麼)(int a, int b)(要什麼)。呼叫處的 Add(3, 4) 就是值 7——它可以去任何值能去的地方。
void:做事的方法,不回答問題
void Greet(string name)
{
Console.WriteLine("Hello, " + name + "!");
}
Greet("Ada");
Greet("Grace");
void 表示"什麼都不返回"——方法做完事,控制權回到呼叫方。需要提前離場時,不帶值的 return; 也可以。
多個 return,一個答案
方法返回它碰到的第一個 return——提前返回勝過深層巢狀:
string Describe(int score)
{
if (score >= 90) return "excellent";
if (score >= 70) return "good";
return "keep practicing";
}
Console.WriteLine(Describe(95));
Console.WriteLine(Describe(75));
Console.WriteLine(Describe(30));
預設值:可選引數
void Greet(string name, string greeting = "Hello")
{
Console.WriteLine(greeting + ", " + name + "!");
}
Greet("Ada"); // greeting 用預設值
Greet("Bob", "Hi"); // 也可以覆蓋
out:一個方法回答兩個問題
return 只能給你一個值。當一個方法既要產出值又要報告成敗——int.TryParse 背後的現真實模式——用 out:
bool TryDouble(int x, out int doubled)
{
doubled = x * 2; // 方法必須給 out 引數賦值
return x < 100; // ……並報告這個值能不能用
}
if (TryDouble(21, out int result))
{
Console.WriteLine("doubled: " + result);
}
遞迴:呼叫自己的方法
int Fib(int n)
{
if (n < 2) return n; // 基線條件:終止自呼叫
return Fib(n - 1) + Fib(n - 2);
}
Console.Write(Fib(10));
每個遞迴都要有基線條件(停止條件)——沒有它,呼叫永不結束,你會得到 StackOverflowException。這裡的引擎在約 900 層巢狀時攔停你,和真實執行時同一個思路。
引數出錯的樣子
引數個數給錯,編譯器在任何東西執行前就攔住你——你會看到 CS1501 / CS7036,引數數量不匹配是它們最常見的觸發器。
現在就練
- 用第 4 課的"執行最大值"模式寫
int Max3(int a, int b, int c)——一個return,不用庫。然後去判題對答案。 - 用
% 10 / 10迴圈寫int SumDigits(int n)——把數位數的模式包成方法。 - 下一課:第 6 課 — 類與物件,方法從此有了家。