這節講一下:特性(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 ...