轉淺析C#中的Attribute

來源:互聯網
上載者:User

標籤:pad   關聯   bsp   ace   關鍵字   編譯器   文章   archive   asi   

一.什麼是Attribute

先看下面的三段代碼:

1.自訂Attribute類:VersionAttribute

    [AttributeUsage(AttributeTargets.Class)]    public class VersionAttribute : Attribute    {        public string Name { get; set; }        public string Date { get; set; }        public string Describtion { get; set; }    }

2.使用自訂Attribute的Class:

    [Version(Name = "hyddd", Date = "2009-07-20", Describtion = "hyddd‘s class")]    public class MyCode    {        //...    }

3.上面這個Class中的Attribute一般會被如何使用呢?

    class Program    {        static void Main(string[] args)        {            var info = typeof(MyCode);            var classAttribute = (VersionAttribute)Attribute.GetCustomAttribute(info, typeof(VersionAttribute));            Console.WriteLine(classAttribute.Name);            Console.WriteLine(classAttribute.Date);            Console.WriteLine(classAttribute.Describtion);        }    }

樣本完畢!上面三段代碼相信已經說明了Attribute大概是一個什麼東西和怎麼去用。

二.深入討論Attribute

1.Attribute的概念定義

     關於Attribute概念的定義,我直接引用《你必須知道的.NET之特性和屬性》中的一段來說明:

     MADN的定義為:通用語言執行平台允許添加類似關鍵字的描述聲明,叫做attributes, 它對程式中的元素進行標註,如類型、欄位、方法和屬性等。Attributes和Microsoft .NET Framework檔案的中繼資料(metadata)儲存在一起,可以用來向運行時描述你的代碼,或者在程式啟動並執行時候影響應用程式的行為。

     我們簡單的總結為:定製特性attribute,本質上是一個類,其為目標元素提供關聯附加資訊,並在運行期以反射的方式來擷取附加資訊。

噢,原來Attribute的目的是為元素提供關聯附加資訊。其中,上面第一段代碼中“[AttributeUsage(AttributeTargets.Class)] ”說明了Attribute提供附加資訊的元素是Class,所以如果上面第二段的代碼改為:

public class MyCode{    [Version(Name = "hyddd", Date = "2009-07-20", Describtion = "hyddd‘s class")]    public void Test() { }}

 

會出現編譯錯誤。

2.Attribute作為編譯指令

     Attribute類是在編譯的時候被執行個體化的,而不是像通常的類那樣在運行時候才執行個體化。所以在第三段代碼中,你可以在沒有執行個體化MyCode對象的情況下取到MyCode的Attribute資訊。由於Attribute類是在編譯的時候被執行個體化的,所以你還可以用外部工具維護這些Attribute資訊。

3.Attribute與Property

     從中文來說,Attribute和Property的中文都叫“屬性”,很容易讓人混淆。現在的文章,Attribute一般翻譯為”特性”,而Property稱為“屬性”。

     或許你會問,我用靜態Property/Field一樣可以做到在不執行個體化的時候拿到一些資訊,如果這樣的話,Attribute又有什麼存在意義呢?

1.Property:

     Property可以說是一個物件導向的概念,提供了對私人欄位的訪問封裝,在C#中以get和set訪問器方法實現對可讀可寫屬性的操作,提供了安全和靈活的資料訪問封裝。比如:

    public class Robot    {        private string name = "";   //欄位:Field        public string Name          //屬性:Property,對Field進行封裝。          {            get { return name; }            set { name = value; }        }    }

2.Attribute:

     Attribute的目標是:為元素提供附加資訊。它的作用更類似於注釋。

可以說,Property/Field和Attribute是兩個完全不同的概念,雖然他們有些時候能做一樣的事,但請記住,他們是從本質上就不同的兩個東西。

三.實現自己的Attribute時需要注意的一些問題

1.自訂的Attribute必須直接或者間接繼承System.Attribute。

2.這裡有一個約定:所有自訂的特性名稱都應該有個Attribute尾碼。因為當你的Attribute施加到一個程式的元素上的時候,編譯器先尋找你的Attribute的定義,如果沒有找到,那麼它就會尋找“Attribute名稱"+Attribute的定義。如果都沒有找到,那麼編譯器就報錯。這就是為什麼我可以再上面第一段代碼中,定義一個VersionAttribute,但在第二段代碼中,我使用卻是Version這個Attribute。:>

下面是一些開發自訂Attribute時,可能需要用到的資料:

【1】Attribute可以關聯的元素包括:

      程式集(assembly)、模組(module)、類型(type)、屬性(property)、事件(event)、欄位(field)、方法(method)、參數(param)、傳回值(return)。例如:

    [assembly: Version(Name = "hyddd", Date = "2009-07-20", Describtion = "hyddd‘s class")]    public class MyCode    {        //......    }

用指定的首碼來表示特性所應用的目標元素,建議這樣來處理,因為顯式處理可以消除可能帶來的二義性。

【2】AttributeTargets目標包括:

標記 說明
All 可以對任何應用程式元素應用屬性。
Assembly 可以對程式集應用屬性。 
Class 可以對類應用屬性。
Constructor 可以對建構函式應用屬性。
Delegate 可以對委託應用屬性。
Enum 可以對枚舉應用屬性。
Event 可以對事件應用屬性。
Field 可以對欄位應用屬性。
GenericParameter 可以對泛型參數應用屬性。
Interface 可以對介面應用屬性。
Method 可以對方法應用屬性。
Module Module 指的是可移植的可執行檔(.dll 或 .exe),而非 Visual Basic 標準模組。
Parameter 可以對參數應用屬性。
Property 可以對屬性 (Property) 應用屬性 (Attribute)。
ReturnValue 可以對傳回值應用屬性。
Struct 可以對結構應用屬性,即實值型別。

【3】AttributeUsageAttribute中的3個屬性(Property)說明:

屬性名稱 說明
ValidOn 該定位參數指定可在其上放置所指示的屬性 (Attribute) 的程式元素。AttributeTargets 枚舉數中列出了可在其上放置屬性 (Attribute) 的所有可能元素的集合。可通過按位“或”運算組合多個 AttributeTargets 值,以擷取所需的有效程式元素組合。
AllowMultiple 該具名引數指定能否為給定的程式元素多次指定所指示的屬性。
Inherited 該具名引數指定所指示的屬效能否由衍生類別和重寫成員繼承。

 

轉載請說明出處,謝謝![hyddd(http://www.cnblogs.com/hyddd/)]

四.參考資料

【1】Msdn

【2】《你必須知道的.NET之特性和屬性》,博主嚴重推薦!

【3】《Attribute在.net編程中的應用》系列文章

轉淺析C#中的Attribute

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.