C 語法之特性

2021-09-08 19:06:27 字數 4031 閱讀 1805

在專案中經常可以看到在類屬性上面有乙個的東西,今天講的東西就是它,它英文名是attribute,中文名是特性。

一、什麼是特性?

首先,我們肯定attribute是乙個類,下面是msdn文件對它的描述:

公共語言執行時允許你新增類似關鍵字的描述宣告,叫做attributes, 它對程式中的元素進行標註,如型別、字段、方法和屬性等。attributes和microsoft .net framework檔案的元資料儲存在一起,可以用來向執行時描述你的**,或者在程式執行的時候影響應用程式的行為。

在.net中,attribute被用來處理多種問題,比如序列化、程式的安全特徵、防止即時編譯器對程式**進行優化從而**容易除錯等等。下面,我們先來看幾個在.net中標準的屬性的使用,稍後我們再回過頭來討論attribute這個類本身。(文中的**使用c#編寫,但同樣適用所有基於.net的所有語言)。上面的解釋說實話這是我複製貼上的。

二、自定義特性

除了c#中系統自帶的特性外我們可以自己定義一些特性。所有自定義的attribute必須從attribute類派生,命名也是要以attribute結尾,在使用的時候可以省略attribute。

using

system;

using

system.collections.generic;

using

system.linq;

using

system.text;

using

system.threading.tasks;

namespace

cusattribute

public customattribute(string

des)}}

在上面的**中定義了乙個customattribute特性,繼承自attribute類,主要功能是為類新增描述資訊。不過在類宣告的上一行有乙個中括號[attributeusage(attributetargets.class,allowmultiple =true,inherited =false)] ,這裡面的attributeusage又是什麼玩意呢?我們可以轉到定義來看一下:

看定義可以看到,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

system;

using

system.collections.generic;

using

system.linq;

using

system.text;

using

system.threading.tasks;

namespace

cusattribute

public

int age }}

上面使用兩次特性,也是沒有報錯是可以的,但是如果allowmultiple設為false,編譯時就會報錯.

2.inherited

先把student、person類也貼出來

using

system;

using

system.collections.generic;

using

system.linq;

using

system.text;

using

system.threading.tasks;

namespace

cusattribute}}

using

system;

using

system.collections.generic;

using

system.linq;

using

system.text;

using

system.threading.tasks;

namespace

cusattribute

public

int age }}

using

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();}}

}

在main方法中我們student和person類中的特性並輸出,通過反射,至於反射以後會有提到

和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...