第十八章 定製特性

2022-07-16 08:54:10 字數 1698 閱讀 3879

目錄:

18.1 使用定製特性

18.2 定義自己的特性類

18.3 特性構造器和字段/屬性資料型別

18.4 檢測定製特性

18.5 兩個特性例項的相互匹配

18.6 檢測定製特性時不建立從attribute派生的物件

18.7 條件特性類

定製特性:利用定製特性,可宣告式地為自己的**構造新增註解來實現特殊功能。定製特性允許為幾乎每乙個元資料表記錄項定義和應用資訊。這種可擴充套件的元資料資訊能在執行時查詢,從而動態改變**的執行方法。

自定義特性將一些附加資訊與某個目標元素關聯起來。編譯器在託管模組的元資料中生成(嵌入)這些額外的資訊。

定製特性其實是乙個型別的例項。為了符合cls的要求,定製特性類必須直接或間接從公共抽象類system.attribut派生。

特性時類的例項,類必須有公共構造器才能建立它的例項。所以,將特性應用於目標元素時,語法型別於呼叫類的某個例項構造器。除此之外,語言可能支援一些特殊的語法,允許設定與特性類關聯的公共欄位或屬性。

構造器引數稱為定位引數,而且時強制性的;也就是說,應用特性時必須指定引數。用於設定欄位或屬性的「引數」稱為「命名引數

attributeusage特性:

公共構造器:它允許傳遞位標誌來指明特性的合法應用範圍。

allowmultiple屬性:設定為true,特性就只能向選定的目標元素應用一次。(可選)

inherited屬性:它指出特性在應用於基類時,是否同時應用於派生類和重寫的方法。true為應用(可選)注意:.net framework只認為類,方法,屬性,事件,字段,方法返回值和引數等目標元素時可繼承的。所以,定義特性型別時,只有在該特性應用於上述某個目標的前提下,才可以將inherited設為true。

應用特性時必須傳遞乙個編譯時常量表示式,它與特性類定義的型別匹配。

編譯器採用增強型構造器語法所指定的值,對任何公共欄位和屬性進行初始化。構造並初始化好定製特性類的物件之後,編譯器將它的狀態序列化到目標元素的元素據表記錄項中。 

可利用反射的技術檢測特性是否存在。

isdefined:如果至少有乙個指定的attribute派生類的例項與目標關聯,就返回true。這個方法效率很高,因為它不夠造(反序列化)特性類的任何例項。

getcustomattributes:返回應用於目標的指定特性物件的集合。每個例項都使用編譯時指定的引數,欄位和屬性來構造(反序列化)。如果目標沒有應用指定等特性類的例項,就返回乙個空集合。該方法通常用於已將allowmultiple設為true的特性,或者用於列出已應用的所有特性。

getcustomattribute;返回應用於目標的指定特性類的例項。例項使用編譯時指定的引數,欄位和屬性來構造(反序列化)。如果目標沒有應用特性類的例項,就返回null。若果目標應用了指定特性的多個例項,就丟擲異常。該方法通常用於已將allowmultiple設為false的特性。

呼叫上述人的方法,內部都必須掃瞄託管模組的元資料,執行字串比較來定位指定的定製特性類。

除了判斷是否向目標應用了乙個特性的例項,可能還需要檢查特性的字段來確定它們的值。

利用system.reflection.customattributedata類

應用了system.diagnostics.conditionalattribute的特性類稱為條件特性。

第十八章 B樹

施工中施工中 基本操作主要包括 搜尋b樹,建立空b樹,插入關鍵字。18.3放出刪除關鍵字的 class program region 磁碟操作 為結點初始化對應的磁碟頁 private static node t allocate node t 磁碟寫操作 private static void d...

第十八章 18 2 3節練習

練習18.18 已知遊俠面的swap的典型定義 參見13.3節,第457頁 當mem1是乙個string時程式使用swap的哪個版本?如果mem1是int呢?說明在這兩種情況下名字查詢的過程。void swap t v1,t v2 解答 這裡典型定義應該指的是有乙個專為string交換而建立的swa...

第十八章 18 3 3節練習

struct base1 struct base2 struct derived public base1 struct mi public derived,public base2 練習18.26 已知如上所示的繼承體系,下面對print的呼叫為什麼是錯誤的?適當修改mi,令其對print的呼叫可...