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

CLR 筆記:屬性與索引子深度解析

     編輯:關於.NET

屬性分類

  • 無參屬性:CLR 支援靜態/實例/抽象/虛擬屬性,不可多載。MSIL 產生 get_XX/set_XX 方法與屬性定義中繼資料。屬性不可作為 out/ref 傳遞(欄位可)。若存取邏輯複雜耗時,優先改用方法(如線程同步、Remoting)。多次存取屬性可能返回不同值(如 DateTime.Now)。
  • 有參屬性:即索引子。get 可接受 1+ 參數,set 可接受 2+ 參數(無參屬性:get 0 參、set 1 參)。C# 索引子為 [] 運算子多載。

索引子多載

可多載,但只能在參數上多載(不可在 this[] 型別上)。無參屬性不可多載。錯誤範例:僅改變 IndexerName 屬性但參數相同,C# 依參數簽章區分,編譯失敗。CLR 不區分無參/有參屬性,皆產生 get_Item/set_Item 與中繼資料(有專用中繼資料表)。反射透過查詢 Item 屬性判斷是否提供索引子(如 List<T>)。

自訂索引子名稱

C# 不直接見 Item,跨語言互操作時可改名:[IndexerName("Bit")] → MSIL 產生 get_Bit/set_Bit。String 類別即使用 Chars 而非 Item。索引子語法 this[..] 意味著 C# 僅允許在實例上定義索引子;CLR 支援靜態有參屬性但 C# 無語法支援。

VB.NET 預設屬性語法

宣告 Default、加上參數、this 變為自訂屬性名稱。

效能:內聯

內聯消除呼叫開銷,代價為程式碼膨脹。屬性存取器通常程式極少,內聯後程式碼更小、執行更快。JIT 偵錯時不內聯屬性方法,故 Release 版屬性存取比 Debug 快;欄位兩版本同速。

存取器可存取性

get 可為 public,set 為 protected。可存取性宣告於屬性名稱前。public string Name { get; protected set; }

不可為泛型

雖屬性本質為方法,但 C# 不允許泛型屬性。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved