attribute 是 .NET Framework 的技術亮點之一。框架大量使用自訂特性完成程式碼約定:[Serializable]、[Flags]、[DllImport]、[AttributeUsage] 等。但初學者常混淆「特性」與「屬性」。
MSDN 定義:CLR 允許添加類關鍵字的描述性宣告,稱為 attributes,用於標註型別、欄位、方法、屬性等程式元素。特性與中繼資料儲存於組件中,可供運行時讀取以影響應用程式行為。
簡單定義:特性本質上是一個類別,為目標元素提供關聯附加資訊,並在運行期透過反射取得。
屬性是物件導向的基本概念,提供對私有欄位的存取封裝,C# 以 get/set 存取器實現資料的安全彈性存取。
| 維度 | 特性 | 屬性 |
|---|---|---|
| 本質 | 衍生自 System.Attribute 的類別 | 類別成員,封裝欄位存取 |
| 用途 | 中繼資料標註、運行時行為控制 | 資料封裝、存取控制 |
| 語法 | [AttributeName] 置於元素上方 | public int Prop { get; set; } |
| 執行時機 | 編譯期初始化,運行期反射讀取 | 運行期存取器執行 |
兩者僅名稱相似(中文皆譯「屬性」),功能與應用層面無交集。本文聚焦特性。
組件、模組、型別、屬性、事件、欄位、方法、參數、回傳值等。
[AttributeUsage]
[Flags]
[AttributeUsage, Flags]
[AttributeUsage(), FlagsAttribute()]
[assembly: MyAttr]、[module: MyAttr]、[type: MyAttr]System.Attribute,具備公用建構函式Attribute 結尾[AttributeUsage] 修飾自訂特性)public[Serializable]、[DataContract])下回將深入探討常用內建特性與自訂特性實作細節。