.NET內建特性(一)
前言
昨天Bill技術分享講到了註解的實質是什麼,註解就是一種替代配置檔案+反射的簡單實現,通過注入一個普通的Java類,通過反射機制,讀到類中的資訊。並且,給大家演示了一下自定義註解,我覺得非常有意思,最近也在學習.NET中的反射,同樣發現了一個.NET中很好玩的知識,那就是.NET內建特性,今天就給大家介紹一下(參考書籍:《.NET之美》張子陽)
what is Attribute?
特性是一種特殊的型別,可以載入到程式集或者程式集中的型別上,這些型別包括模組、類、介面、結構、建構函式、方法、方法引數等,載入了特性的型別稱作特性的目標。特性是為程式集新增元資料(描述資料的資料)的一種機制,通過它可以為編譯器提供指示或者對資料的說明。他是一種宣告性的標籤。
說白了就是可以對程式中的元素進行標註,用來向執行時描述你的程式碼,或者在程式執行的時候影響應用程式的行為
When and Where to use Attribute?
舉個例子:
現在有一個訊息系統,存在一個傳送訊息的方法,用來發送一則短的訊息給某人:
//標題,作者,內容,接受者ID
public bool SendMsg(string title, string author, string content, int receiverId) {
bool flag = true;
//do send action
return flag;
}
這樣將傳送的內容直接通過引數進行傳遞,擴充套件性很糟糕,我們但凡需要傳遞新的屬性,就要修改方法,所以,我們最好定義一個Message類,將這類簡訊小封裝起來,然後將物件當做引數進行傳遞
public class Message {
private string title;
private string author;
private string content;
private int receiverID;
public string Title { get; set; }
public string Author { get; set; }
public string Content { get; set; }
public int ReceiverID { get; set; }
}
public bool SendMsg(Message msg) {
//Do some Action
}
有了新的SendMsg()方法後,可以將舊的方法刪除,用這個擴充套件性更好的SendMsg()方法來取代。但是,有可能很多程式中已經用到了舊的方法,如果刪除,程式將不能正常的執行,所以我們想到了使用方法過載,這樣就不需要刪除原有的方法了
但是如果新的方法在效能方面也進行了優化,我們想要告知客戶端程式我們有了一個新的SendMsg的方法可以使用,就會使用到.NET內建的特性
public class TestClass {
//新增Obsolete(已廢棄)特性
[Obsolete("請使用新的SendMsg(Message msg)過載方法")]
public static void ShowMsg() {
Console.WriteLine("這是舊的SendMsg()方法");
}
public static void ShowMsg(Message msg) {
Console.WriteLine("新的SendMsg()方法");
}
}
static void Main(string[] args)
{
TestClass.ShowMsg();
TestClass.ShowMsg(new Message());
}
這時我們會發現,編譯器在第一個方法會給出一個警告,這就是Obsolete特性起到的作用:
我們跟到Obsolete特性中看看他的原始碼是什麼樣的:
Obsolete特性的本質是一個繼承自Attribute的密封類,而且它的全名是ObsoleteAttribute,標記的時候卻只用到了Obsolete,這是.NET的一個約定,所有的特性應該都是以Attribute來結尾,在標記的時候,如果沒有加Attribute,編譯器會自動尋找帶有Attribute的版本
總結
這一篇部落格,簡單的介紹一下特性的是什麼,還有他的應用場景,下一篇部落格將自定義一個特性,然後使用反射來檢視特性中的內容~這麼一看其實特性和註解在用法實現上很相似,只不過註解是使用@,而特性是使用“[]”,如果有理解不到位的地方,還請各位多多指出~大家共同進步