C 特性學習筆記

2022-03-01 20:10:13 字數 2504 閱讀 2964

本筆記摘抄自:記錄一下學習過程以備後續查用。

特性提供功能強大的方法,用以將元資料或宣告資訊與**(程式集、型別、方法、屬性等)相關聯。 特性與程式實體關聯後,即可在執行時使用名為「反射」的技術查詢特性。

特性,如serializable,它其實就是乙個類,定義方式跟類一樣,且所有特性都是直接或間接繼承自attribute基類。

自定義乙個特性permissionattribute:

[attributeusage(attributetargets.class, allowmultiple = false, inherited = false

)]

public

class permissionattribute : attribute //

類名是特性的名稱

}

下面讓我們看看,如何建立乙個自定義特性?

1)乙個自定義特性類必須直接或間接繼承自system.attribute特性類。

2)為該自定義特性類指定system.attributeusage特性,並指定限制引數(列舉system.attributetargets和可選的allowmultiple、inherited命名引數)。attributeusage的命名引數:allowmultiple表示是否允許多次使用在同一目標上、inherited表示是否同時應用於派生型別或過載版本。

3)類名是特性的名稱。

4)建構函式的引數是自定義特性的定位引數(應用該特性時必須放在引數列表的最前面),也可以是無參建構函式(如[serializable])。

5)任何公共的讀寫欄位或屬性都是可選的命名引數。

6)如果特性類包含乙個屬性,則該屬性必須為讀寫屬性。

示例**如下:

[permission("

01_01

","使用者資料

",compno ="

db_system")]

public

class

users

public

int adduser(string userid,string

username)

}

應用特性 [permission("01_01","使用者資料",compno ="db_system")] 其實是通過建構函式的呼叫來例項化乙個特性類。

根據約定,所有特性名稱都以單詞「attribute」結束,如可系列化標記特性serializable,它的全稱為serializableattribute。在**中使用特性時,不需要指定attribute字尾,如上面**,只需用permission即可代表permissionattribute特性。

利用反射的原理,關聯特性類與目標型別(反射:主要利用type類的屬性和方法來獲得乙個目標型別的型別資訊物件,然後根據該物件可以得到目標型別的資訊,如它的字段、屬性、方法名、類名等,有了這些資訊,下一步就可以為所欲為了,可以還原該型別,即反系列化,甚至建立乙個新型別)。

示例**如下:

class

program

}[permission(

"01_01

","使用者資料

",compno ="

db_system")]

public

class

users

public

int adduser(string userid,string

username)

}static

void main(string

args)}}

}

view code

執行結果如下:

當編譯器發現乙個特性應用到乙個目標並發生關聯時:

1)首先會把"attribute"追加到特性的名稱(若使用了簡寫),形成完整的特性類名。

2)然後在其所有引入的命名空間中搜尋該特性類,若找不到該類或它與目標不匹配時,則產生編譯錯誤。

3)檢查傳遞給特性的引數,並查詢該特性中帶定位引數的建構函式(或無參建構函式)和其它可選的命名引數(特性類的公共字段、屬性),若找到匹配的建構函式,則例項化該特性類,編譯器還會把目標型別的元資料傳遞給程式集,反射可以從程式集中讀取元資料,若找不到則產生編譯錯誤。

關聯**也可以定義在目標型別的內部:

[permission("

01_01

","使用者資料

",compno ="

db_system")]

public

class

users

public

int adduser(string userid,string

username)

}return0;}}

至於.net預定義特性的實現原理,我沒研究過,大概類似自定義特性吧,就比如系列化特性serializableattribute,實現原理我想大概是這樣:應用[serializable]時給目標做乙個「標記」,在.net內建程式集的某個地方判斷該目標型別是否應用了該特性,然後決定是否進行系列化操作。

C 特性自用學習筆記

本文用於隨手記錄一些自己學習中碰到的c 特性。對於以下std tuple std tuple int,std string,double foo 在未有該特性前,對其解包很麻煩,使用std get要寫一大串 std cout std get 0 foo std get 1 foo std get 2...

c 學習筆記 附新特性

這裡有一些是新特性,有一些是為了描述新特性另外說明的一些東西。參考 入口 這篇文章對三種繼承方式講的很明白,感覺自己多說乙個字都不對勁。成員預設是private,繼承預設也是private。參考 入口 基類中的virtual 0,為純虛函式,否則為虛函式。class person class stu...

C 特性筆記

此處是本人對c 的一些筆記,c 高手請直接略過。翔哥看到了也請略過。函式前使用virtual修飾,表示該函式是虛函式,那麼虛函式有什麼用呢?虛函式對於程式的多型起到了很重要的作用。具體的使用簡單介紹一下 class a class b public a 然後在main函式中,我們如此呼叫 b pb ...