| 中文慣稱 | 英文 | 本質 | 用途 |
|---|---|---|---|
| 特性 | Attribute | 繼承 System.Attribute 的類別,編譯期嵌入中繼資料 | 序列化控制、編譯器指令、設計模式標記、運行期反射讀取 |
| 屬性 | Property | 類別成員,封裝 get/set 存取器 | 資料封裝、繫結、驗證、介面契約 |
MSDN 早期將 Attribute 譯為「屬性」造成混淆,現建議統稱 Attribute 為「特性」。
assembly、module、type、property、event、field、method、param、return[AttributeName]、[AttributeName(...)]、[Attr1, Attr2]、[Attr1(), Attr2()][assembly: MyAttr]、[module: MyAttr]、[type: MyAttr]、[method: MyAttr]、[property: MyAttr]、[event: MyAttr]、[field: MyAttr]、[param: MyAttr]、[return: MyAttr]Attribute 結尾(如 ObsoleteAttribute),使用時可省略AttributeUsage(Inherited=true) 控制衍生類別是否繼承AllowMultiple=truepublic| Attribute | 用途 | 關鍵屬性 |
|---|---|---|
AttributeUsage | 控制自訂 Attribute 套用規則 | ValidOn、AllowMultiple、Inherited |
Flags | 列舉視為位元旗標 | ToString() 輸出 "A, B" 而非數值 |
DllImport | 呼叫非託管 DLL | EntryPoint、CallingConvention、CharSet |
Serializable | 標記型別可序列化 | 配合 ISerializable 自訂 |
Conditional | 條件編譯方法呼叫 | DEBUG、TRACE 等符號控制 |
Obsolete | 標記過時成員 | Message、IsError |
Description/Category/DefaultValue/Browsable | 設計工具屬性格柵顯示控制 | 屬性視窗分組、預設值、可見性 |
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = true)]
public class TestAttribute : Attribute {
public string Message { get; }
public TestAttribute(string msg) => Message = msg;
public void RunTest() => Console.WriteLine($"TestAttribute: {Message}");
}
// 套用
[Test("驗證邏輯")]
public class MyClass {
[Test("前置條件")]
public void DoWork() { }
}
// 反射讀取
var attr = (TestAttribute)Attribute.GetCustomAttribute(typeof(MyClass), typeof(TestAttribute));
attr?.RunTest();
var method = typeof(MyClass).GetMethod("DoWork");
var attrs = method.GetCustomAttributes();
foreach (var a in attrs) a.RunTest();
[DataContract]/[DataMember]、[JsonPropertyName][Required]/[StringLength]/[Range] (DataAnnotations)[Inject]/[Service] 標記注入點[Test]/[TestCase]/[Ignore] (NUnit/xUnit)[Table]/[Column]/[Key] (EF/Dapper)[Log]/[Cache]/[Transaction] (PostSharp/DynamicProxy)Attribute 是 .NET 中繼資料驅動程式設計的基石。掌握其定義規則、反射讀取與內建/自訂應用,能讓架構更乾淨、擴充性更強。下一回將深入探討「類別與結構」的記憶體模型差異。