週末逛超市時,我目睹了一場堪比動作大片的「搶收銀台」實況。一位打扮時尚的女生靈活穿梭貨架之間,購物車操控得行雲流水,甚至上演了「普加喬夫眼鏡蛇機動」般的急轉彎,最終衝向收銀台卻不幸「撞車」被紅牌罰下。這荒誕又生動的一幕,竟意外啟發了我對 C# Attribute 的理解——正如超市貨架上的商品貼著標籤(價格、產地、保存期限),程式碼中的類別、方法也能貼上「標籤」,這就是 Attribute 的核心概念。
許多初學者對 Attribute 感到困惑,原因主要有二:一是平時較少直接使用;二是翻譯易混淆。早期譯者常將 Attribute 與 Property 同譯為「屬性」,造成極大困擾。現今共識已明確:Attribute 譯為「特性」,Property 才是「屬性」。
簡單來說,Attribute 就是一種「附著物」。如同牡蠣吸附在船底,它依附於程式碼元素(類別、方法、屬性等)之上,為其附加額外資訊(如作者、版本、過時標記等)。這些資訊會被編譯進組件的中繼資料,並在執行期透過反射讀取,以影響程式行為。
假設一個工具類由小張、小李共同維護,部分方法曾有 Bug。若不使用 Attribute,只能在方法名或註解硬編碼資訊,維護極其痛苦。引入 ConditionalAttribute 後,一切變得優雅:
[Conditional("LI")]
[Conditional("BUGED")]
public static void Method1() { Console.WriteLine("Created By Li, Buged."); }
搭配 #define 宏,編譯器會根據條件決定是否保留方法呼叫。執行結果顯示,只有符合條件的方法真正執行,完美解決分類執行、統計工作量、回歸測試等需求。
[] 包裹,緊貼目標之前。[ConditionalAttribute("LI")] 與 [Conditional("LI")] 等價。[Conditional("NOBUG"), Conditional("LI")] 亦可。理解了 Attribute 的用途與語法,下一篇將深入探討 Attribute 的本質原理,並徹底釐清 Attribute 與 Property 的區別。敬請期待《深入淺出 Attribute(中)——Attribute 的本質》與《深入淺出 Attribute(下)——Attribute V.S. Property》。
法律聲明:本文受知識產權法保護,轉載請保持完整性,註明出處 BKJIA 及作者 劉鐵猛(博客連結),並發送郵件至 liutm@beyondsoft.com。原文出處:上善若水 潤物無聲。