程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> [你必須知道的.NET] 第三回:歷史糾葛:特性和屬性(1)

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

編輯:關於C語言

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訪問器方法實現對可讀可寫屬性的操作,提供了安全和靈活的數據訪問封裝。關於屬性的概念,不是本文的重點,而且相信大部分的技術人員應該對屬性有清晰的概念。以下是簡單的屬性示例:

2.3. 區別與比較

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

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

3. 通用規則

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

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

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

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

using System;

namespace Anytao.Net
{
[assembly: MyAttribute(1)] //應用於程序集
[moduel: MyAttribute(2)] //應用於模塊
pubic class Attribute_how2do
{
//
}
}

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

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

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

[AttributeUsageAttribute(AttributeTarget.All),
AllowMultiple = true,
Inherited = true]
class MyNewAttribute: System.Attribute
{
//
}

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

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

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

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

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

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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved