方法宣告完整語法結構
[attributes] [method-modifiers] return-type member-name (formal-parameter-list)
{
// method-body: 陳述式區塊
}
必要與可選元素
| 元素 | 必要性 | 說明 |
| attributes | 可選 | 如 [Obsolete], [MethodImpl] |
| method-modifiers | 可選 | 存取修飾詞 + static/virtual/override/abstract 等 |
| return-type | 必要 | 任何合法型別,無回傳用 void |
| member-name | 必要 | 方法名稱,同類別內不可與其他方法/成員同名 (多載除外) |
| formal-parameter-list | 可選 | 無參數寫 () |
| method-body | 視修飾詞而定 | abstract/extern 只有分號;其他需區塊 |
回傳值機制
return 運算式;:回傳值並離開方法。
return;:僅用於 void 方法提前離開。
- 非
void 方法所有路徑必須回傳值,否則編譯錯誤 CS0161。
- C# 7.0+ 支援
ref return 回傳參考。
public int Max(int x, int y) {
if (x > y) return x;
return y; // 確保所有路徑回傳
}
方法修飾詞完整對照 (含現代擴充)
| 修飾詞 | 說明 | 互斥組 |
| new | 隱藏基類別同名成員 | — |
| public/protected/internal/private | 存取層級 | 單一 |
| static | 類別層級,無 this | A |
| virtual | 可被 override | A |
| override | 覆寫基類別 virtual/abstract | A |
| abstract | 無本體,強制實作 | A |
| sealed | 禁止進一步 override | 需配合 override |
| extern | 外部實作 (P/Invoke) | — |
| async | 非同步方法 | — |
| unsafe | 允許指標/非安全代碼 | — |
| partial | 部分方法 (僅宣告/實作分離) | — |
互斥組 A:static/virtual/override/abstract 任兩兩互斥。
參數列表詳細語法
[attributes] [parameter-modifiers] type identifier [= default-value]
parameter-modifiers: ref / out / in / params
參數修飾詞規則
ref、out、in 互斥,不可共用。
params 僅能出現在最後一個參數,且型別必須為一維陣列。
in 參數 (C# 7.2+) 僅讀,防止意外修改,適合大型 readonly struct。
方法命名慣例與限制
- PascalCase:
CalculateTotal, GetUserById。
- 布林回傳方法加前綴:
IsValid, HasPermission, CanExecute。
- 非同步方法加
Async 後綴:DownloadAsync。
- 同類別內不可與欄位/屬性/事件同名 (多載除外),否則編譯錯誤 CS0102。
部分方法
partial class Generator {
// 宣告 (可無本體)
partial void OnGenerated(string code);
// 實作 (可在另一個 partial 檔案)
partial void OnGenerated(string code) => Console.WriteLine(code);
}
- 必須在
partial 類別/結構體中。
- 隱含
private,不可有存取修飾詞。
- 回傳型別必須
void,不可有 out 參數 (可有 ref/in)。
- 若無實作,編譯器會移除呼叫點代碼 (零開銷)。
常見編譯錯誤對照
| 錯誤碼 | 原因 | 修正 |
| CS0161 | 非 void 方法非所有路徑回傳值 | 補全 return 或拋出例外 |
| CS0120 | 靜態方法存取非靜態成員 | 傳遞實例參考或改為非靜態 |
| CS0102 | 類別內重複定義同名成員 | 重命名或使用多載 |
| CS0542 | 建構子名稱不符類別名稱 | 修正名稱 |
| CS1520 | 方法必須有回傳型別 | 加上 void 或具體型別 |