方法 是程式碼復用的基本單元,良好的方法設計能大幅提升可讀性、可維護性與測試性。本文彙整八大核心觀念,涵蓋流程控制、重構技巧、參數傳遞機制、多型與重載規則。
return:結束整個方法,將控制權交還呼叫者,可攜帶回傳值。break:僅跳出當前迴圈或 switch,繼續執行方法後續程式碼。void Demo()
{
for (int i = 0; i < 10; i++)
{
if (i == 3) return; // 方法直接結束,不會執行 Console.WriteLine("End")
if (i == 5) break; // 跳出迴圈,繼續執行 Console.WriteLine("End")
}
Console.WriteLine("End");
}
| 操作 | 步驟 | 適用情境 |
|---|---|---|
| 提取方法 | 選取程式碼區塊 → 右鍵 → 重構 → 提取方法 (Ctrl+R, M) | 將重複邏輯封裝為獨立方法 |
| 產生方法存根 | 呼叫尚未定義的方法名 → 滑鼠停留紅波浪線 → Ctrl+. → Enter | 自上而下設計,先寫呼叫端再實作細節 |
void 回傳型別的方法,**所有執行路徑** 必須以 return 值; 結束。void 方法可省略 return; 或僅用 return; 提前離開。public class Person
{
public string Name { get; set; }
// 建構函數:無 void、int 等修飾詞
public Person(string name) => Name = name;
}
public void Log(params string[] messages)
{
foreach (var msg in messages) Console.WriteLine(msg);
}
// 呼叫方式多樣
Log("單一訊息");
Log("多筆", "訊息", "自動", "封裝成陣列");
Log(new[] { "也可", "直接傳", "陣列" });
限制:params 必須是**最後一個參數**,且每個方法僅能有一個 params 參數。編譯器會自動將實參包裝成陣列,屬於語法糖。
public static void Swap(ref int a, ref int b)
{
int temp = a; a = b; b = temp;
}
int x = 1, y = 2; // 必須先賦值
Swap(ref x, ref y); // x=2, y=1
out 參數賦值 (確定指派規則)。bool TryParse(string s, out int result)。public bool TryGetUser(int id, out User user)
{
user = _db.Find(id); // 必須賦值,即使找不到也要指派 null
return user != null;
}
// 呼叫端
if (TryGetUser(10, out var u)) Console.WriteLine(u.Name);
條件 (任一滿足即可):
不影響多載:回傳型別、參數名稱、ref/out 修飾詞 (單獨改修飾詞不構成多載)。
void Process(int x) { }
void Process(double x) { } // 型別不同 → 多載
void Process(int x, int y) { } // 個數不同 → 多載
// void Process(ref int x) { } // 僅 ref 不同 → 編譯錯誤 (與第一個衝突)
本質:多載解析在**編譯期**由靜態型別決定,屬於語言語法特性,非物件導向多型 (虛擬方法覆寫才是執行期多型)。
| 關鍵字 | 用途 | 呼叫端需初始化 | 方法內需賦值 |
|---|---|---|---|
| (無) | 值傳遞 (預設) | 是 | 否 |
| ref | 引用傳遞,可讀可寫 | **是** | 否 (可選) |
| out | 輸出參數,必寫 | 否 | **是** |
| params | 可變參數陣列 | 視元素型別 | N/A |