在專案中經常可以看到在類屬性上面有乙個的東西,今天講的東西就是它,它英文名是attribute,中文名是特性。
一、什麼是特性?
首先,我們肯定attribute是乙個類,下面是msdn文件對它的描述:
公共語言執行時允許你新增類似關鍵字的描述宣告,叫做attributes, 它對程式中的元素進行標註,如型別、字段、方法和屬性等。attributes和microsoft .net framework檔案的元資料儲存在一起,可以用來向執行時描述你的**,或者在程式執行的時候影響應用程式的行為。
在.net中,attribute被用來處理多種問題,比如序列化、程式的安全特徵、防止即時編譯器對程式**進行優化從而**容易除錯等等。下面,我們先來看幾個在.net中標準的屬性的使用,稍後我們再回過頭來討論attribute這個類本身。(文中的**使用c#編寫,但同樣適用所有基於.net的所有語言)。上面的解釋說實話這是我複製貼上的。
二、自定義特性
除了c#中系統自帶的特性外我們可以自己定義一些特性。所有自定義的attribute必須從attribute類派生,命名也是要以attribute結尾,在使用的時候可以省略attribute。
using在上面的**中定義了乙個customattribute特性,繼承自attribute類,主要功能是為類新增描述資訊。不過在類宣告的上一行有乙個中括號[attributeusage(attributetargets.class,allowmultiple =true,inherited =false)] ,這裡面的attributeusage又是什麼玩意呢?我們可以轉到定義來看一下:system;
using
system.collections.generic;
using
system.linq;
using
system.text;
using
system.threading.tasks;
namespace
cusattribute
public customattribute(string
des)}}
看定義可以看到,attributeusage其實也是繼承自attribute,也是乙個特性。那來說下這個類裡面的3個屬性validon、allowmultiple、inherited.
1.validon:可以看到它是attributetargets型別,而attributetargets轉到定義可以看到是乙個列舉型別。指明attribute 可以被施加的元素的型別。
2.allowmultiple:它是乙個布林值。表示是否可以對乙個程式元素施加多個attribute。
3.inherited:它也是乙個布林值,表示是否施加的attribute 可以被派生類繼承或者過載
使用下面的**一步一步驗證上面的3個屬性。
我們定義了乙個person基類,定義了student類繼承自person類。
1.allowmultiple
將上面的特性設定為[attributeusage(attributetargets.class,allowmultiple =true,inherited =false)]時
using上面使用兩次特性,也是沒有報錯是可以的,但是如果allowmultiple設為false,編譯時就會報錯.system;
using
system.collections.generic;
using
system.linq;
using
system.text;
using
system.threading.tasks;
namespace
cusattribute
public
int age }}
2.inherited
先把student、person類也貼出來
usingsystem;
using
system.collections.generic;
using
system.linq;
using
system.text;
using
system.threading.tasks;
namespace
cusattribute}}
usingsystem;
using
system.collections.generic;
using
system.linq;
using
system.text;
using
system.threading.tasks;
namespace
cusattribute
public
int age }}
using在main方法中我們student和person類中的特性並輸出,通過反射,至於反射以後會有提到system;
using
system.collections.generic;
using
system.linq;
using
system.text;
using
system.threading.tasks;
namespace
cusattribute "
, attr.custormdescription, attributes[i]);
}console.writeline(
"-----------------------");
info = typeof
(person);
attributes = info.getcustomattributes(true
);
for (int i = 0; i < attributes.length; i++)
",attr.custormdescription,attributes[i]);
}console.readline();}}
}
和allowmultiple一起有4種可能性.
對於inherited:false時就不說了,不能被派生類繼承,當inherited:true時,allowmultiple:true的話派生類不會覆蓋父類的特性,allowmultiple:false的話派生類會覆蓋父類的特性。
3.validon
這個主要是乙個列舉。可以看下列舉都有什麼.也就是說可以將特性應用到下面的列舉型別中。
////摘要:
//指定可以對它們應用特性的應用程式元素。
[comvisible(true
)] [flags]
public
enum
attributetargets
C 語法新特性
下面介紹下c 的新語法,這些新語法使程式設計更方便快捷 往往一行 能起到老語法幾行功能 同時也更健壯減少異常發生,方便閱讀。個人認為很有必要掌握下。新建乙個product類 和shoppingcart public class product public string category water...
React之jsx語法特性
jsx 語法,直接可以在js中使用html標籤。還可以通過花括號的形式,在html標籤中,寫js表示式。hello,world!事件是大寫 addreact中的程式設計思想是,面向資料程式設計。只要定義資料就ok了,資料變了,頁面展示的內容就會變了。react刪除不需要操作dom,只需要運算元據就可...
c 11特性之次要語法清除
首先,介紹的是兩個新特性在c 11中,他們是次要的,但是在日常程式設計很重要 空格在模版表示式中 要求輸入空格在兩個 之間 vector ok,在任何c 表示式中 vector ok 在c 11中 在這本書中 你會發現這兩種形式 nullptr和std nullptr t 在c 11中,你能夠使用n...