C 中的特性標籤 Attribute

2021-10-10 17:46:35 字數 1752 閱讀 9444

這節講一下:特性(attribute)。

特性,是用來給**新增額外資訊的一種手段,我們通常是將特性標記到方法,類或者屬性上,在使用的這些結構的時候,通過反射(reflection)這一非常高階的技術,獲取它們通過特性標記的資訊,從而進行某些特殊的處理。

系統也給我們提供了一些特性,比如serializable 標記乙個可序列化的類,debuggerstepthrough設定方法在除錯時為跳過的狀態。

[serializable]

class sunshine

它其實是省略了(),如果使用特性的其它的構造方法,顯示宣告即可:

[serializable("test")]

class sunshine

接下來,看一下如何自定義特性,請先看如下**:

class myattribute : attribute

public void getname()

");}}​

[my("charles")]

public void showattribute()

自定義特性,很簡單,讓乙個類繼承attribute類即可,這是oop的很常用的操作,另外,自定義的特性,名稱字尾約定是attribute結尾,使用的時候這個字尾可以省略。現在我們用反射,讀取這個方法的特性資訊:

type type = typeof(program);//獲取這個類的型別資訊

methodinfo methodinfo = type.getmethod("showattribute");//獲取該類下的showattribute方法

//獲取特性資訊,返回特性的例項物件

myattribute customattribute = methodinfo.getcustomattribute();

customattribute.getname();//呼叫方法

getcustomattribute泛型方法用於獲取某個特定的特性,返回該特性例項,還有乙個getcustomattributes()方法用於獲取所有的特性。

ienumerableattributes = methodinfo.getcustomattributes();

foreach (attribute attribute in attributes)

反射獲取的就是這個特性的例項,它的構造方法就是方法宣告中的構造方法,所以我們可以在類上標記資訊,通過構造傳參,傳入資訊。但是一般我們不會這樣使用,一般都是配合框架,通過繼承框架中為我們寫好的特性,進行定製操作。

另外,還有一些標記在特性上的特性,用於設定特性的用途,或者是否可以重複宣告等等:

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

class myattribute : attribute

attributeusage用於設定特性的使用範圍,它第乙個引數需要乙個列舉,也可以通過或(|)將需要的多個列舉關聯起來。它的第二個可選引數是allowmultiple,用於設定是否可以重複標記在乙個結構上。它的第三個可選引數是inherited,用於設定是否可以繼承,預設為true。

C 中的特性

c 中的特性,允許向程式的程式集增加元資料,用於儲存程式結構資訊。obsolete特性標記方法已被棄用。並在 編譯時,顯示警告資訊。obsolete 該方法已被棄用 static void oldmethod conditional特性,使用或取消方法的呼叫,執行依賴於指定的預處理識別符號。cond...

C 中的「Squiggles」特性

從vb.net開始 就具有的後台編譯器,給了開發人員實時的編譯器錯誤反饋,持續地更新 完成資料,並作為其他特性的宿主。這個功能的缺點在於它不能被關閉,因為太多的特 性要依賴於它擁有的資料。而另一方面,c 卻只有有限的語法檢查,而 完成只在編譯時才會完全更新。u0026 xd n 這當然不是微軟所希望...

C 中的case標籤

switch case語句在c 程式中使用的較為頻繁,但是有很多細節可能平時不會注意到,本文總結一下switch case語句中的case標籤。1 case是標籤 先來說下標籤 label 如下一段 cpp view plain copy print include using namespace ...