今天就跟大家聊聊有關(guān)C#中Attribute與Property如何使用,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。
創(chuàng)新互聯(lián)為企業(yè)級客戶提高一站式互聯(lián)網(wǎng)+設(shè)計服務(wù),主要包括網(wǎng)站建設(shè)、成都網(wǎng)站制作、重慶App定制開發(fā)、小程序開發(fā)、宣傳片制作、LOGO設(shè)計等,幫助客戶快速提升營銷能力和企業(yè)形象,創(chuàng)新互聯(lián)各部門都有經(jīng)驗豐富的經(jīng)驗,可以確保每一個作品的質(zhì)量和創(chuàng)作周期,同時每年都有很多新員工加入,為我們帶來大量新的創(chuàng)意。
一.什么是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); } }
示例完畢!上面三段代碼相信已經(jīng)說明了Attribute大概是一個什么東西和怎么去用。
二.深入討論Attribute
1.Attribute的概念定義
關(guān)于Attribute概念的定義,我直接引用《你必須知道的.NET之特性和屬性》中的一段來說明:
MADN的定義為:公共語言運(yùn)行時允許添加類似關(guān)鍵字的描述聲明,叫做attributes, 它對程序中的元素進(jìn)行標(biāo)注,如類型、字段、方法和屬性等。Attributes和Microsoft .NET Framework文件的元數(shù)據(jù)(metadata)保存在一起,可以用來向運(yùn)行時描述你的代碼,或者在程序運(yùn)行的時候影響應(yīng)用程序的行為。
我們簡單的總結(jié)為:定制特性attribute,本質(zhì)上是一個類,其為目標(biāo)元素提供關(guān)聯(lián)附加信息,并在運(yùn)行期以反射的方式來獲取附加信息。
噢,原來Attribute的目的是為元素提供關(guān)聯(lián)附加信息。其中,上面***段代碼中“[AttributeUsage(AttributeTargets.Class)] ”說明了Attribute提供附加信息的元素是Class,所以如果上面第二段的代碼改為:
public class MyCode { [Version(Name = "hyddd", Date = "2009-07-20", Describtion = "hyddd's class")] public void Test() { } }
會出現(xiàn)編譯錯誤。
2.Attribute作為編譯指令
Attribute類是在編譯的時候被實例化的,而不是像通常的類那樣在運(yùn)行時候才實例化。所以在第三段代碼中,你可以在沒有實例化MyCode對象的情況下取到MyCode的Attribute信息。由于Attribute類是在編譯的時候被實例化的,所以你還可以用外部工具維護(hù)這些Attribute信息。
3.Attribute與Property
從中文來說,Attribute和Property的中文都叫“屬性”,很容易讓人混淆。現(xiàn)在的文章,Attribute一般翻譯為”特性”,而Property稱為“屬性”。
或許你會問,我用靜態(tài)的Property/Field一樣可以做到在不實例化的時候拿到一些信息,如果這樣的話,Attribute又有什么存在意義呢?
1.Property:
Property可以說是一個面向?qū)ο蟮母拍?,提供了對私有字段的訪問封裝,在C#中以get和set訪問器方法實現(xiàn)對可讀可寫屬性的操作,提供了安全和靈活的數(shù)據(jù)訪問封裝。比如:
public class Robot { private string name = ""; //字段:Field public string Name //屬性:Property,對Field進(jìn)行封裝。 { get { return name; } set { name = value; } } }
2.Attribute:
Attribute的目標(biāo)是:為元素提供附加信息。它的作用更類似于注釋。
可以說,Property/Field和Attribute是兩個完全不同的概念,雖然他們有些時候能做一樣的事,但請記住,他們是從本質(zhì)上就不同的兩個東西。
三.實現(xiàn)自己的Attribute時需要注意的一些問題
1.自定義的Attribute必須直接或者間接繼承System.Attribute。
2.這里有一個約定:所有自定義的特性名稱都應(yīng)該有個Attribute后綴。因為當(dāng)你的Attribute施加到一個程序的元素上的時候,編譯器先查找你的Attribute的定義,如果沒有找到,那么它就會查找“Attribute名稱"+Attribute的定義。如果都沒有找到,那么編譯器就報錯。這就是為什么我可以再上面***段代碼中,定義一個VersionAttribute,但在第二段代碼中,我使用卻是Version這個Attribute。:>
下面是一些開發(fā)自定義Attribute時,可能需要用到的資料:
【1】Attribute可以關(guān)聯(lián)的元素包括:
程序集(assembly)、模塊(module)、類型(type)、屬性(property)、事件(event)、字段(field)、方法(method)、參數(shù)(param)、返回值(return)。例如:
[assembly: Version(Name = "hyddd", Date = "2009-07-20", Describtion = "hyddd's class")] public class MyCode { //...... }
用指定的前綴來表示特性所應(yīng)用的目標(biāo)元素,建議這樣來處理,因為顯式處理可以消除可能帶來的二義性。
【2】AttributeTargets目標(biāo)包括:
【3】AttributeUsageAttribute中的3個屬性(Property)說明:
看完上述內(nèi)容,你們對C#中Attribute與Property如何使用有進(jìn)一步的了解嗎?如果還想了解更多知識或者相關(guān)內(nèi)容,請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝大家的支持。