C 學習筆記 Attribute

2022-07-04 03:24:14 字數 4064 閱讀 7587

學習參考:

今天在討論ipc通訊契約的時候,盧工提到使用attribute來描述具體的介面方法的命令資訊。發現對 attribute的概念還不是很熟悉,因此對其進行學習梳理。

1、attribute是什麼?它有什麼用?

先來看看官方的定義:

msdn文件對它的描述:公共語言執行時允許新增類似關鍵字的描述宣告,叫做attributes, 它對程式中的元素進行標註,如型別、字段、方法和屬性等。attributes和microsoft .net framework檔案的元資料儲存在一起,可以用來向執行時描述你的**,或者在程式執行的時候影響應用程式的行為。
簡單的定義本質上是乙個類,其為目標元素提供關聯附加資訊,並在執行期以反射的方式來獲取附加資訊。具體的特性實現方法,在接下來的討論中繼續深入。

看定義總是有距離感,還是看看實際的應用吧。

2、常用場景

.net中常見的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類是在編譯的時候被例項化的,而不是像通常的類那樣在執行時候才例項化。

3、自定義特性

1、自定義的attribute必須直接或者間接繼承system.attribute。

2、所有自定義的特性名稱都應該有個attribute字尾,命名規範為:"類名"+attribute

3、使用attributeusage來限定你的attribute 所施加的元素的型別,attributeusage本身也是乙個attribute。它有乙個帶引數的構造器,這個引數是attributetargets的列舉型別

public

enum

attributetargets

此外,attributeusage還定義了以下三個屬性:

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

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

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

下面是乙個自定義特性的例子,摘自這裡:

using

system;

using system.reflection; //

應用反射技術獲得特性資訊

namespace

anytao.net

public myselfattribute(string name, int

age)

//定義屬性

//顯然特性和屬性不是一回事兒

public

string

name

}public

intage

}public

string

memo

set

}//定義方法

public

void

showname()

", _name == null ? "

world.

": _name);}}

//應用自定義特性

//可以以myself或者myselfattribute作為特性名

//可以給屬性memo賦值

[myself("

emma

", 25, memo = "

emma is my good girl.")]

public

class

mytest

}public

class

myrun

", myattribute.name);

console.writeline(

"age:

", myattribute.age);

console.writeline(

"memo of is

", myattribute.name, myattribute.memo);

myattribute.showname();

}//多點反射

object obj = activator.createinstance(typeof

(mytest));

methodinfo mi = tp.getmethod("

sayhello");

mi.invoke(obj,

null

); console.readline();}}

}

4、使用flagsattribute修飾列舉

flagsattribute屬性就是列舉型別的一項可選屬性。它的主要作用是可以將列舉作為位域處理,所謂位域是單個儲存單元內相鄰二進位制位的集合。在.net framework中有很多列舉都是用flagsattribute特性修飾,例如:正規表示式選項system.text.regularexpressions.regexoptions、檔案監視中的檔案改變型別system.io.watcherchangetypes、system.web.ui.webcontrols.datacontrolrowstate等等。

使用flagsattribute需要注意:

1、只有要對數值執行按位運算(and、or、xor)時才對列舉使用 flagsattribute 自定義屬性。

2.、必須用 2 的冪(即 1、2、4、8 等)定義列舉常量。

using

system;

class

flagsattributedemo

; [flagsattribute]

enum color2 : short

;

static

void

main()

", mycolor1);

color1 mycolor_1 = color1.red |color1.blue;

//我先不執行計算一下看看是那個:0001|0100=0101 應該是5

console.writeline("

mycolor_1=

",mycolor_1);

console.writeline(

"測試使用flagsattribute屬性");

color2 mycolor2 = color2.red |color2.blue;

//我先不執行計算一下看看是那個:0001|0100=0101應該是red,blue

console.writeline("

mycolor2=

", mycolor2);

console.readkey();

}}

Attribute 學習筆記

一 attribute 是為目標元素新增附加資訊的一種描述宣告,在執行的時候通過反射的方式來獲取附加的資訊。二 使用attributeusage來定義自定義attribute的屬性,attributeusage本身也是乙個attribute,這是專門施加在attribute類的attribute.a...

C 特性Attribute學習

起初一直糾結於如何呼叫特性附著在下面那個成員的值,後來發現不需要呼叫,通過反射載入的時候是自動繫結上去的,即 獲得成員物件之後,有乙個方法可以獲得特性標籤。其實從類庫提供者,和類庫使用者的角度,分開來看就很容易理解了。類庫提供者 myclasslib類 myclasslib類有乙個showstrin...

C 特性Attribute學習

起初一直糾結於如何呼叫特性附著在下面那個成員的值,後來發現不需要呼叫,通過反射載入的時候是自動繫結上去的,即 獲得成員物件之後,有乙個方法可以獲得特性標籤。其實從類庫提供者,和類庫使用者的角度,分開來看就很容易理解了。類庫提供者 myclasslib類 myclasslib類有乙個showstrin...