承接上篇文章,本文將深入探討 partial 部分類型的限制條件、注意事項、屬性累加效應、修飾符一致性規則,以及基類與介面的繼承機制。
| 限制 | 說明 |
|---|---|
| 1. 適用型別 | 僅支援 class、struct、interface,不支援 delegate 與 enum |
| 2. partial 修飾符 | 同一型別的所有部分必須都標記 partial |
| 3. 命名空間 | 所有部分必須位於相同命名空間中 |
| 4. 同時編譯 | 所有部分必須在同一次編譯單元中編譯 |
partial 是情境關鍵字,僅在緊接 class/struct/interface 時具有關鍵字語意,不影響現有名為 partial 的變數名稱.cs 檔案,但編譯器允許置於同一檔案(方便教學展示)定義於各部分類型上的屬性會自動合併:
[Attribute1, Attribute2("Hello")]
partial class Class1 { }
[Attribute3, Attribute2("Exit")]
partial class Class1 { }
// 等同於
[Attribute1, Attribute2("Hello"), Attribute3, Attribute2("Exit")]
class Class1 { }
註:Attribute2 需標記 [AttributeUsage(AllowMultiple = true)] 才允許重複套用。
| 規則 | 說明 |
|---|---|
| 存取修飾符 | 所有部分的存取修飾符 (public/internal 等) 必須一致 |
| abstract | 任一部分標記 abstract,整個類別視為抽象類別 |
| sealed | 任一部分標記 sealed,整個類別視為密封類別 |
| 衝突禁止 | 不可同時使用 abstract 與 sealed (互斥) |
partial class Class2 : IInterface1, IInterface2 { }
partial class Class2 : IInterface3 { }
partial class Class2 : IInterface2 { }
// 等同於
class Class2 : IInterface1, IInterface2, IInterface3 { }
介面清單會自動合併去重,順序不影響語意。
ClassName.Core.cs、ClassName.Serialization.cs、ClassName.UI.cs 等FormName.Designer.cs) 與手寫邏輯分離,避免衝突