Attribute的基本概念

2021-04-13 06:57:01 字數 4907 閱讀 9685

經常有朋友問,attribute是什麼?它有什麼用?好像沒有這個東東程式也能執行。實際上在.net中,attribute是乙個非常重要的組成部分,為了幫助大家理解和掌握attribute,以及它的使用方法,特地收集了幾個attribute使用的例子,提供給大家參考。

在具體的演示之前,我想先大致介紹一下attribute。我們知道在類的成員中有property成員,二者在中文中都做屬性解釋,那麼它們到底是不是同乙個東西呢?從**上看,明顯不同,首先就是它們的在**中的位置不同,其次就是寫法不同(attribute必須寫在一對方括符中)。

什麼是atrribute

首先,我們肯定attribute是乙個類,下面是msdn文件對它的描述:

公共語言執行時允許你新增類似關鍵字的描述宣告,叫做attributes, 它對程式中的元素進行標註,如型別、字段、方法和屬性等。attributes和microsoft .net framework檔案的元資料儲存在一起,可以用來向執行時描述你的**,或者在程式執行的時候影響應用程式的行為。

在.net中,attribute被用來處理多種問題,比如序列化、程式的安全特徵、防止即時編譯器對程式**進行優化從而**容易除錯等等。下面,我們先來看幾個在.net中標準的屬性的使用,稍後我們再回過頭來討論attribute這個類本身。(文中的**使用c#編寫,但同樣適用所有基於.net的所有語言)

在c#中存在著一定數量的編譯器指令,如:#define debug, #undefine debug, #if等。這些指令專屬於c#,而且在數量上是固定的。而attribute用作編譯器指令則不受數量限制。比如下面的三個attribute:

下面的**演示了上述三個屬性的使用:

#define debug //這裡定義條件

using system;

using system.runtime.interopservices;

using system.diagnostics;

namespace attributedemo

[conditional("debug")]

private static void displayrunningmessage()

[conditional("debug")]

[obsolete]

private static void displaydebugmessage()

}}

如果在乙個程式元素前面宣告乙個attribute,那麼就表示這個attribute被施加到該元素上,前面的**,[dllimport]施加到messagebox函式上, [conditional]施加到displayruntimemessage方法和displaydebugmessage方法,[obsolete]施加到displaydebugmessage方法上。

根據上面涉及到的三個attribute的說明,我們可以猜到程式執行的時候產生的輸出:dllimport attribute表明了messagebox是user32.dll中的函式,這樣我們就可以像內部方法一樣呼叫這個函式。

重要的一點就是attribute就是乙個類,所以dllimport也是乙個類,attribute類是在編譯的時候被例項化的,而不是像通常的類那樣在執行時候才例項化。attribute例項化的時候根據該attribute類的設計可以帶引數,也可以不帶引數,比如dllimport就帶有"user32.dll"的引數。conditional對滿足引數的定義條件的**進行編譯,如果沒有定義debug,那麼該方法將不被編譯,讀者可以把#define debug一行注釋掉看看輸出的結果(release版本,在debug版本中conditional的debug總是成立的)。obsolete表明了dispalydebugmessage方法已經過時了,它有乙個更好的方法來代替它,當我們的程式呼叫乙個宣告了obsolete的方法時,那麼編譯器會給出資訊,obsolete還有其他兩個過載的版本。大家可以參考msdn中關於的obsoleteattribute 類的描述。

除了.net提供的那些attribute派生類之外,我們可以自定義我們自己的attribute,所有自定義的attribute必須從attribute類派生。現在我們來看一下attribute 類的細節:

protected attribute(): 保護的構造器,只能被attribute的派生類呼叫。

三個靜態方法:

static attribute getcustomattribute():這個方法有8種過載的版本,它被用來取出施加在類成員上指定型別的attribute。

static attribute getcustomattributes(): 這個方法有16種過載版本,用來取出施加在類成員上指定型別的attribute陣列。

static bool isdefined():由八種過載版本,看是否指定型別的定製attribute被施加到類的成員上面。

例項方法:

bool isdefaultattribute(): 如果attribute的值是預設的值,那麼返回true。

bool match():表明這個attribute例項是否等於乙個指定的物件。

公共屬性: typeid: 得到乙個唯一的標識,這個標識被用來區分同乙個attribute的不同例項。

我們簡單地介紹了attribute類的方法和屬性,還有一些是從object繼承來的。這裡就不列出來了。

下面介紹如何自定義乙個attribute: 自定義乙個attribute並不需要特別的知識,其實就和編寫乙個類差不多。自定義的attribute必須直接或者間接地從attribute這個類派生,如:

public mycustomattribute : attribute

這裡需要指出的是attribute的命名規範,也就是你的attribute的類名+"attribute",當你的attribute施加到乙個程式的元素上的時候,編譯器先查詢你的attribute的定義,如果沒有找到,那麼它就會查詢「attribute名稱"+attribute的定義。如果都沒有找到,那麼編譯器就報錯。

對於乙個自定義的attribute,你可以通過attributeusage的attribute來限定你的attribute 所施加的元素的型別。**形式如下: [attriubteusage(引數設定)] public 自定義attribute : attribute

非常有意思的是,attributeusage本身也是乙個attribute,這是專門施加在attribute類的attribute. attributeusage自然也是從attribute派生,它有乙個帶引數的構造器,這個引數是attributetargets的列舉型別。下面是attributetargets 的定義:

public enum attributetargets

作為引數的attributetarges的值允許通過「或」操作來進行多個值得組合,如果你沒有指定引數,那麼預設引數就是all 。 attributeusage除了繼承attribute 的方法和屬性之外,還定義了以下三個屬性:

allowmultiple: 讀取或者設定這個屬性,表示是否可以對乙個程式元素施加多個attribute 。

inherited:讀取或者設定這個屬性,表示是否施加的attribute 可以被派生類繼承或者過載。

validon: 讀取或者設定這個屬性,指明attribute 可以被施加的元素的型別。

using system; 

namespace atttargscs

// 該attribute只對方法有效.

[attributeusage(attributetargets.method)]

public class methodtargetattribute : attribute

// 該attribute只對構造器有效。

[attributeusage(attributetargets.constructor)]

public class constructortargetattribute : attribute

// 該attribute只對字段有效.

[attributeusage(attributetargets.field)]

public class fieldtargetattribute : attribute

// 該attribute對類或者方法有效(組合).

[attributeusage(attributetargets.class|attributetargets.method)]

public class clas**ethodtargetattribute : attribute

// 該attribute對所有的元素有效.

[attributeusage(attributetargets.all)]

public class alltargetsattribute : attribute

//上面定義的attribute施加到程式元素上的用法

[classtarget]    //施加到類

[clas**ethodtarget]//施加到類

[alltargets] //施加到類

public class testclassattribute

[methodtarget] //施加到方法

[clas**ethodtarget] //施加到方法

[alltargets] //施加到方法

public void method1()

[fieldtarget] //施加到字段

[alltargets] //施加到字段

public int myint;

static void main(string args)

}}

至此,我們介紹了有關attribute類和它們的**格式。你一定想知道到底如何在你的應用程式中使用attribute,如果僅僅是前面介紹的內容,還是不足以說明attribute有什麼實用價值的話,那麼從後面的章節開始我們將介紹幾個attribute的不同用法,相信你一定會對attribute有乙個新的了解 

基本概念 C 基本概念

由於工作中需要用到c 編寫的一些工具,有時候需要根據需求修改或者定製工具,所以現在不得不學習一下c 的基礎語法,此為筆記,不成章法!機器語言 組合語言 高階語言 面向過程的程式設計方法 物件導向的程式設計方法 泛型程式設計方法 1 演算法設計 2 源程式編輯 3 編譯 4 連線 5 執行除錯 輸入裝...

基本概念 數控系統基本概念

第一章 基本概念 數控工具機cnc是一種按事先編制好的加工零件程式進行加工的高效 自動化加工裝置。是 computer numerical control machine tools 的簡稱。數控工具機較好地解決了複雜 精密 小批量 多品種的零件加工問題,是一種柔性的 高效能的自動化工具機。西門子系...

pwm的基本概念

脈寬調變pwm是開關型穩壓電源中的術語。這是按穩壓的控制方式分類的,除了pwm型,還有pfm型和pwm pfm混合型。脈寬寬度調製式 pwm 開關型穩壓電路是在控制電路輸出頻率不變的情況下,通過電壓反饋調整其占空比,從而達到穩定輸出電壓的目的。pwm技術的基本原理 隨著電子技術的發展,出現了多種pw...