[你必須知道的.NET] 第三回:歷史糾葛:特性和屬性

作者: Anytao  來源: 博客園  發布時間: 2008-09-11 16:04  閱讀: 6313 次  推薦: 0   原文鏈接   [收藏]  
 

系列文章導航:

[你必須知道的.NET] 開篇有益

[你必須知道的.NET] 第一回:恩怨情仇:is和as

[你必須知道的.NET] 第二回:對抽象編程:接口和抽象類

[你必須知道的.NET] 第三回:歷史糾葛:特性和屬性

[你必須知道的.NET] 第四回:后來居上:class和struct

[你必須知道的.NET] 第五回:深入淺出關鍵字---把new說透

[你必須知道的.NET] 第六回:深入淺出關鍵字---base和this

[你必須知道的.NET] 第七回:品味類型---從通用類型系統開始

[你必須知道的.NET] 第八回:品味類型---值類型與引用類型(上)-內存有理

[你必須知道的.NET] 第九回:品味類型---值類型與引用類型(中)-規則無邊

[你必須知道的.NET] 第十回:品味類型---值類型與引用類型(下)-應用征途

[你必須知道的.NET] 第十一回:參數之惑---傳遞的藝術(上)

[你必須知道的.NET] 第十二回:參數之惑---傳遞的藝術(下)

[你必須知道的.NET] 第十三回:從Hello, world開始認識IL

[你必須知道的.NET] 第十四回:認識IL代碼---從開始到現在

[你必須知道的.NET] 第十五回:繼承本質論

[你必須知道的.NET] 第十六回:深入淺出關鍵字---using全接觸

[你必須知道的.NET] 第十七回:貌合神離:覆寫和重載

[你必須知道的.NET] 第十八回:對象創建始末(上)

[你必須知道的.NET] 第十九回:對象創建始末(下)

[你必須知道的.NET]第二十回:學習方法論

[你必須知道的.NET]第二十一回:認識全面的null

[你必須知道的.NET]第二十二回:字符串駐留(上)---帶著問題思考

[你必須知道的.NET]第三十二回,深入.NET 4.0之,Tuple一二

 

  本文將介紹以下內容:

  • 定制特性的基本概念和用法

  • 屬性與特性的區別比較

  • 反射的簡單介紹

  1. 引言

  attribute是.NET框架引入的有一技術亮點,因此我們有必要花點時間來了解本文的內容,走進一個發現attribute登堂入室的入口。因為.NET Framework中使用了大量的定制特性來完成代碼約定,[Serializable]、[Flags]、[DllImport]、[AttributeUsage]這些的構造,相信我們都見過吧,那么你是否了解其背后的技術。

  提起特性,由于高級語言發展的歷史原因,不免讓人想起另一個耳熟能詳的名字:屬性。特性和屬性,往往給初學者或者從C++轉移到C#的人混淆的概念沖擊。那么,什么是屬性,什么是特性,二者的概念和區別,用法與示例,將在本文做以概括性的總結和比較,希望給你的理解帶來收獲。另外本文的主題以特性的介紹為主,屬性的論述重點突出在二者的比較上,關于屬性的更多論述將在另一篇主題中詳細討論,敬請關注。

  2. 概念引入

  2.1. 什么是特性?

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

  我們簡單的總結為:定制特性attribute,本質上是一個類,其為目標元素提供關聯附加信息,并在運行期以反射的方式來獲取附加信息。具體的特性實現方法,在接下來的討論中繼續深入。

  2.2. 什么是屬性?

  屬性是面向對象編程的基本概念,提供了對私有字段的訪問封裝,在C#中以get和set訪問器方法實現對可讀可寫屬性的操作,提供了安全和靈活的數據訪問封裝。關于屬性的概念,不是本文的重點,而且相信大部分的技術人員應該對屬性有清晰的概念。以下是簡單的屬性示例:

Code

 

  2.3. 區別與比較

  通過對概念的澄清和歷史的回溯,我們知道特性和屬性只是在名稱上有過糾葛,在MSDN上關于attribute的中文解釋甚至還是屬性,但是我同意更通常的稱呼:特性。在功能上和應用上,二者其實沒有太多模糊的概念交叉,因此也沒有必要來比較其應用的異同點。本文則以特性的概念為重點,來討論其應用的場合和規則。

  我理解的定制特性,就是為目標元素,可以是數據集、模塊、類、屬性、方法、甚至函數參數等加入附加信息,類似于注釋,但是可以在運行期以反射的方式獲得。定制特性主要應用在序列化、編譯器指令、設計模式等方面。

  3. 通用規則

  • 定制特性可以應用的目標元素可以為:程序集(assembly)、模塊(module)、類型(type)、屬性(property)、事件(event)、字段(field)、方法(method)、參數(param)、返回值(return),應該全了。

  • 定制特性以[,]形式展現,放在緊挨著的元素上,多個特性可以應用于同一元素,特性間以逗號隔開,以下表達規則有效:[AttributeUsage][ Flags]、[AttributeUsage, Flags]、[Flags, AttibuteUsageAttribute]、[AttributeUsage(), FlagesAttribute()]

  • attibute實例,是在編譯期進行初始化,而不是運行期。

  • C#允許以指定的前綴來表示特性所應用的目標元素,建議這樣來處理,因為顯式處理可以消除可能帶來的二義性。例如:  

Code

 

  • 定制特性類型,必須直接或者間接的繼承自System.Attribute類,而且該類型必須有公有構造函數來創建其實例。

  • 所有自定義的特性名稱都應該有個Attribute后綴,這是習慣性約定。

  • 定制特性也可以應用在其他定制特性上,這點也很好理解,因為定制特性本身也是一個類,遵守類的公有規則。例如很多時候我們的自定義定制特性會應用AttributeUsageAttribute特性,來控制如何應用新定義的特性。

Code

 

  • 定制特性不會影響應用元素的任何功能,只是約定了該元素具有的特質。

  • 所有非抽象特性必須具有public訪問限制。

  • 特性常用于編譯器指令,突破#define, #undefine, #if, #endif的限制,而且更加靈活。

  • 定制特性常用于在運行期獲得代碼注釋信息,以附加信息來優化調試。

  • 定制特性可以應用在某些設計模式中,如工廠模式。

  • 定制特性還常用于位標記,非托管函數標記、方法廢棄標記等其他方面。

0
0
 
標簽:.NET 特性 屬性
 
 

文章列表

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()