C# 2.0 引入 partial 關鍵字,允許將單一類別、結構、介面或方法的定義分散在多個原始碼檔案中,編譯時合併為單一類型。這項特性主要解決:設計器生成代碼與開發者代碼的物理隔離,並為團隊並行開發、大型類別模組化提供支援。本文深度解析其語法、編譯行為、IL 特徵、限制條件、巢狀分部類型、實戰應用模式。
// File1.cs
public partial class SampleClass {
public void MethodA() { Console.WriteLine("A"); }
}
// File2.cs
public partial class SampleClass {
public void MethodB() { Console.WriteLine("B"); }
}
// 編譯後等價於:
public class SampleClass {
public void MethodA() { Console.WriteLine("A"); }
public void MethodB() { Console.WriteLine("B"); }
}
partial 可用於:class、struct、interface、method (C# 3.0+ 分部方法)public/private/abstract/sealed 等必須相容,衝突編譯報錯
// Form1.cs (開發者代碼)
public partial class Form1 : Form {
public Form1() { InitializeComponent(); }
private void btnClick_Click(object sender, EventArgs e) { /* 邏輯 */ }
}
// Form1.Designer.cs (設計器生成,勿手動修改)
partial class Form1 {
private Button btnClick;
private void InitializeComponent() {
this.btnClick = new Button();
this.btnClick.Click += btnClick_Click;
// ... 控制項初始化
}
}
優勢:無 #region Designer Code、無誤刪風險、版本控制差異清晰、設計器重生成不影響邏輯代碼。
csc /target:module 不支援跨模組合併)csc 呼叫中處理
// 驗證:編譯後用 ILDASM 查看,只有一個 SampleClass,方法 A/B 皆屬之
| 規則 | 說明 | 違反後果 |
|---|---|---|
| 基類一致性 | 若多處指定基類,必須相同 | CS0261: 類型定義衝突 |
| 介面列表合併 | 所有分部實現的介面取聯集 | — |
| 泛型參數 | 所有分部必須有相同型別參數名稱/約束 | CS0261 |
| 屬性合併 | 所有分部的屬性(Attribute)取聯集 | — |
| 分部方法 | partial void 無實現則編譯器移除呼叫 (C# 3.0+) | — |
C# 允許巢狀類型同樣為 partial,編譯器遞歸合併:
public partial class Outer {
public partial class Inner {
public void Method1() { }
}
}
public partial class Outer {
public partial class Inner {
public void Method2() { }
}
}
// 等價於 Outer.Inner 含 Method1/Method2
partial class Order { /* 核心屬性 */ } + partial class Order { /* 計價邏輯 */ } + partial class Order { /* 持久化 */ }partial class Dto { /* 序列化 */ },開發者只寫核心屬性partial class Feature { /* 完整版 */ } + partial class Feature { /* 精簡版 */ } 搭配 #ifpartial 可跨組件 → 錯,必須同一編譯單元partial class 可繼承不同基類 → 錯,編譯報錯partial 影響執行時行為 → 錯,純編譯時語法糖partial 是 C# 2.0 為工具支援、大型專案維護性引入的實用特性。本質是編譯器層面的原始碼合併,零執行時開銷,零 IL 痕跡。核心價值在於關注點分離:設計器 vs 邏輯、生成代碼 vs 手寫代碼、模組 A vs 模組 B。現代 C# 開發中,配合 Source Generators、大型實體類模組化、條件編譯構建變體,partial 仍是不可或缺的架構工具。