日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
學(xué)習(xí)C#:Attribute與Property

一.什么是Attribute

先看下面的三段代碼:

1.自定義Attribute類:VersionAttribute

 
 
 
 
  1. [AttributeUsage(AttributeTargets.Class)]  
  2. public class VersionAttribute : Attribute  
  3. {  
  4.     public string Name { get; set; }  
  5.     public string Date { get; set; }  
  6.     public string Describtion { get; set; }  

2.使用自定義Attribute的Class:

 
 
 
 
  1. [Version(Name = "hyddd", Date = "2009-07-20", Describtion = "hyddd's class")]  
  2. public class MyCode  
  3. {  
  4.     //...  

3.上面這個(gè)Class中的Attribute一般會(huì)被如何使用呢?

 
 
 
 
  1. class Program  
  2. {  
  3.     static void Main(string[] args)  
  4.     {  
  5.         var info = typeof(MyCode);  
  6.         var classAttribute = (VersionAttribute)Attribute.GetCustomAttribute(info, typeof(VersionAttribute));  
  7.         Console.WriteLine(classAttribute.Name);  
  8.         Console.WriteLine(classAttribute.Date);  
  9.         Console.WriteLine(classAttribute.Describtion);  
  10.     }  

示例完畢!上面三段代碼相信已經(jīng)說明了Attribute大概是一個(gè)什么東西和怎么去用。

二.深入討論Attribute

1.Attribute的概念定義

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

MADN的定義為:公共語言運(yùn)行時(shí)允許添加類似關(guān)鍵字的描述聲明,叫做attributes, 它對(duì)程序中的元素進(jìn)行標(biāo)注,如類型、字段、方法和屬性等。Attributes和Microsoft .NET Framework文件的元數(shù)據(jù)(metadata)保存在一起,可以用來向運(yùn)行時(shí)描述你的代碼,或者在程序運(yùn)行的時(shí)候影響應(yīng)用程序的行為。

我們簡單的總結(jié)為:定制特性attribute,本質(zhì)上是一個(gè)類,其為目標(biāo)元素提供關(guān)聯(lián)附加信息,并在運(yùn)行期以反射的方式來獲取附加信息。

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

 
 
 
 
  1. public class MyCode  
  2. {  
  3.     [Version(Name = "hyddd", Date = "2009-07-20", Describtion = "hyddd's class")]  
  4.     public void Test() { }  
  5. }  
  6.  

會(huì)出現(xiàn)編譯錯(cuò)誤。

2.Attribute作為編譯指令

Attribute類是在編譯的時(shí)候被實(shí)例化的,而不是像通常的類那樣在運(yùn)行時(shí)候才實(shí)例化。所以在第三段代碼中,你可以在沒有實(shí)例化MyCode對(duì)象的情況下取到MyCode的Attribute信息。由于Attribute類是在編譯的時(shí)候被實(shí)例化的,所以你還可以用外部工具維護(hù)這些Attribute信息。

3.Attribute與Property

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

或許你會(huì)問,我用靜態(tài)的Property/Field一樣可以做到在不實(shí)例化的時(shí)候拿到一些信息,如果這樣的話,Attribute又有什么存在意義呢?

1.Property:

Property可以說是一個(gè)面向?qū)ο蟮母拍睿峁┝藢?duì)私有字段的訪問封裝,在C#中以get和set訪問器方法實(shí)現(xiàn)對(duì)可讀可寫屬性的操作,提供了安全和靈活的數(shù)據(jù)訪問封裝。比如:

 
 
 
 
  1. public class Robot  
  2. {  
  3.     private string name = "";   //字段:Field  
  4.     public string Name          //屬性:Property,對(duì)Field進(jìn)行封裝。  
  5.       {  
  6.         get { return name; }  
  7.         set { name = value; }  
  8.     }  

2.Attribute:

Attribute的目標(biāo)是:為元素提供附加信息。它的作用更類似于注釋。

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

三.實(shí)現(xiàn)自己的Attribute時(shí)需要注意的一些問題

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

2.這里有一個(gè)約定:所有自定義的特性名稱都應(yīng)該有個(gè)Attribute后綴。因?yàn)楫?dāng)你的Attribute施加到一個(gè)程序的元素上的時(shí)候,編譯器先查找你的Attribute的定義,如果沒有找到,那么它就會(huì)查找“Attribute名稱"+Attribute的定義。如果都沒有找到,那么編譯器就報(bào)錯(cuò)。這就是為什么我可以再上面***段代碼中,定義一個(gè)VersionAttribute,但在第二段代碼中,我使用卻是Version這個(gè)Attribute。:>

下面是一些開發(fā)自定義Attribute時(shí),可能需要用到的資料:

【1】Attribute可以關(guān)聯(lián)的元素包括:

程序集(assembly)、模塊(module)、類型(type)、屬性(property)、事件(event)、字段(field)、方法(method)、參數(shù)(param)、返回值(return)。例如:

 
 
 
 
  1. [assembly: Version(Name = "hyddd", Date = "2009-07-20", Describtion = "hyddd's class")]  
  2. public class MyCode  
  3. {  
  4.     //......  

用指定的前綴來表示特性所應(yīng)用的目標(biāo)元素,建議這樣來處理,因?yàn)轱@式處理可以消除可能帶來的二義性。

【2】AttributeTargets目標(biāo)包括:

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

   

四.參考資料

【1】Msdn

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

【3】《Attribute在.net編程中的應(yīng)用》系列文章


網(wǎng)站欄目:學(xué)習(xí)C#:Attribute與Property
URL分享:http://www.dlmjj.cn/article/ccosges.html