.net屬性和特性的區(qū)別
特性
MADN的定義為:公共語言運(yùn)行時(shí)允許添加類似關(guān)鍵字的描述聲明,叫做attributes, 它對(duì)程序中的元素進(jìn)行標(biāo)注,如類型、字段、方法和屬性等。Attributes和Microsoft .NET Framework文件的元數(shù)據(jù)保存在一起,可以用來向運(yùn)行時(shí)描述你的代碼,或者在程序運(yùn)行的時(shí)候影響應(yīng)用程序的行為。
我們簡單的總結(jié)為:定制特性attribute,本質(zhì)上是一個(gè)類,其為目標(biāo)元素提供關(guān)聯(lián)附加信息,并在運(yùn)行期以反射的方式來獲取附加信息。具體的特性實(shí)現(xiàn)方法,在接下來的討論中繼續(xù)深入。
屬性
屬性是面向?qū)ο缶幊痰幕靖拍?,提供了?duì)私有字段的訪問封裝,在C#中以get和set訪問器方法實(shí)現(xiàn)對(duì)可讀可寫屬性的操作,提供了安全和靈活的數(shù)據(jù)訪問封裝。關(guān)于屬性的概念,不是本文的重點(diǎn),而且相信大部分的技術(shù)人員應(yīng)該對(duì)屬性有清晰的概念。
區(qū)別
通過對(duì)概念的澄清和歷史的回溯,我們知道特性和屬性只是在名稱上有過糾葛,在MSDN上關(guān)于attribute的中文解釋甚至還是屬性,但是我同意更通常的稱呼:特性。在功能上和應(yīng)用上,二者其實(shí)沒有太多模糊的概念交叉,因此也沒有必要來比較其應(yīng)用的異同點(diǎn)。本文則以特性的概念為重點(diǎn),來討論其應(yīng)用的場(chǎng)合和規(guī)則。
我理解的定制特性,就是為目標(biāo)元素,可以是數(shù)據(jù)集、模塊、類、屬性、方法、甚至函數(shù)參數(shù)等加入附加信息,類似于注釋,但是可以在運(yùn)行期以反射的方式獲得。定制特性主要應(yīng)用在序列化、編譯器指令、設(shè)計(jì)模式等方面。
常用特性
常用特性,也就是.NET已經(jīng)提供的固有特性,事實(shí)上在.NET框架中已經(jīng)提供了豐富的固有特性由我們發(fā)揮,以下精選出我認(rèn)為最常用、最典型的固有特性做以簡單討論,當(dāng)然這只是我的一家之言,亦不足道。我想了解特性,還是從這里做為起點(diǎn),從.NET提供的經(jīng)典開始,或許是一種求知的捷徑,希望能給大家以啟示。
AttributeUsage
AttributeUsage特性用于控制如何應(yīng)用自定義特性到目標(biāo)元素。關(guān)于AttributeTargets、AllowMultiple、Inherited、ValidOn,請(qǐng)參閱示例說明和其他文檔。我們已經(jīng)做了相當(dāng)?shù)慕榻B和示例說明,我們還是在實(shí)踐中自己體會(huì)更多吧。
Flags
以Flags特性來將枚舉數(shù)值看作位標(biāo)記,而非單獨(dú)的數(shù)值。
Serializable
Serializable特性表明了應(yīng)用的元素可以被序列化(serializated),序列化和反序列化是另一個(gè)可以深入討論的話題,在此我們只是提出概念,深入的研究有待以專門的主題來呈現(xiàn),限于篇幅,此不贅述。
Conditional
Conditional特性,用于條件編譯,在調(diào)試時(shí)使用。注意:Conditional不可應(yīng)用于數(shù)據(jù)成員和屬性。
還有其他的重要特性,包括:Description、DefaultValue、Category、ReadOnly、BrowerAble等,有時(shí)間可以深入研究。