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# 無語法支援。
宣告 Default、加上參數、this 變為自訂屬性名稱。
內聯消除呼叫開銷,代價為程式碼膨脹。屬性存取器通常程式極少,內聯後程式碼更小、執行更快。JIT 偵錯時不內聯屬性方法,故 Release 版屬性存取比 Debug 快;欄位兩版本同速。
get 可為 public,set 為 protected。可存取性宣告於屬性名稱前。public string Name { get; protected set; }
雖屬性本質為方法,但 C# 不允許泛型屬性。