首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# 2.0 部分型別深度解析:跨檔案定義、屬性合併與名稱繫結

     編輯:關於C語言

部分型別宣告語法

attributes? modifiers? partial? class identifier type-params? : base? constraints? body
attributes? modifiers? partial? struct identifier type-params? : interfaces? constraints? body
attributes? modifiers? partial? interface identifier type-params? : base? constraints? body
  • partial 非關鍵字,僅在緊鄰型別關鍵字時有特殊意義
  • 所有部分必須標記 partial,同命名空間、同組件編譯
  • 巢狀型別同樣支援 partial,通常外層也為 partial
  • 不支援委派、列舉

編譯期合併規則

屬性合併

[Attr1, Attr2("hello")] partial class A { }
[Attr3, Attr2("goodbye")] partial class A { }
// 等價於
[Attr1, Attr2("hello"), Attr3, Attr2("goodbye")] class A { }

型別參數屬性同理合併。

修飾詞一致性

  • 存取修飾詞(public/internal 等)必須一致,否則編譯錯誤
  • new(巢狀型別隱藏):任一部分有即生效
  • abstract:任一部分有即為抽象類別(不可同時 sealed)
  • unsafe:僅標記部分視為 unsafe 內容

型別參數與約束

  • 所有部分必須宣告相同數量、名稱、順序的型別參數
  • 約束(where)集合必須一致(類別、介面、new())
  • 順序不拘,where K: IComparable; where V: IPersistable ≡ where V: IPersistable; where K: IComparable

基類與基底介面

  • 基類:指定者必須一致,未指定預設 System.Object
  • 介面:所有部分指定介面的聯集,重複允許,成員實作唯一
  • 介面實作可分散於不同部分

成員合併

  • 所有部分成員的聯集
  • 共享單一宣告空間,作用域跨越所有部分
  • private 成員跨部分可存取
  • 同名同簽章成員重複宣告 → 編譯錯誤(除非為 partial 方法)
  • 成員順序未定義(影響互通性時需注意)

名稱繫結與 Using 指示詞

各部分可有不同 using,簡單名稱解析僅參考該部分的 using:

namespace N {
    using List = System.Collections.ArrayList;
    partial class A { List x; }  // x: ArrayList
}
namespace N {
    using List = Widgets.LinkedList;
    partial class A { List y; }  // y: LinkedList
}

同一識別項在不同部分可解析為不同型別。

部分方法

// 宣告部分(通常工具生成)
partial void OnCreated();
// 實作部分(通常手寫)
partial void OnCreated() { Console.WriteLine("Created!"); }
  • 簽章必須匹配,回傳 void,不可 out 參數
  • 若無實作,呼叫端與宣告皆移除(零成本)
  • 隱含 private,不可為 virtual/abstract/override
  • 常用於設計工具生成碼的擴充點
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved