您好,登錄后才能下訂單哦!
什么是特性,我自己的理解是:
特性是一種允許我們向程序集增加元數(shù)據(jù)的語言結(jié)構(gòu)。它是用于保存程序結(jié)構(gòu)信息的特殊的類。特性有2個基本概念:“目標(biāo)”,“消費者”,就拿特殊性DebuggerStepThrough來說,編譯器就是消費者,當(dāng)它遇到被此特性注冊過的Mothed時,就不會進(jìn)入此Mothed執(zhí)行(斷點時)會直接得到此Methed的運行結(jié)果,而次Method就是目標(biāo)了??偠灾?,應(yīng)用了特性的語言結(jié)構(gòu)叫“目標(biāo)”;設(shè)計用來獲取和使用此特性的就叫“消費者”。
下面講解.Net自帶的幾個比較著名的特性
1,Obsolete : 提示Method過時
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace AtrributeTest.com { /// <summary> /// 用于測試Obsolete特性 /// 目標(biāo):Method /// 消費者 : IDE /// </summary> public sealed class ObsoleteTest { [Obsolete("這個方法已經(jīng)過時,請使用MyNewMethod方法",false)] public void MyOldMethd() { Console.WriteLine("這是一個過時的方法"); } public void MyNewMethod() { Console.WriteLine("這是一個新方法"); } } }
測試:
可以看出當(dāng)IDE跳出提示時,會自動在有“Obsolete”標(biāo)志的Method上劃一橫線(表示不提倡使用),我在Obsolete的構(gòu)造函數(shù)中提示“這個方法已經(jīng)過時,請使用MyNewMethod方法”也只IDE提示中顯示出來。關(guān)于Obsolete的第二個參數(shù)(Boolean),它表是“是否不能使用”。如果為true,當(dāng)使用了MyOldMethd方法后,編譯會報錯;反之(False的情況),只是不提倡使用。
2,Conditional : 取消Method的任何調(diào)用
這個的話我認(rèn)為并沒有編譯參數(shù)好用。我先放測試代碼,再給出解釋
1,此內(nèi)中有一個方法“MyTestMethod”被Conditional特性修飾
using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Text; namespace AtrributeTest.com { /// <summary> /// 用于測試Condition特性 /// 目標(biāo):Method /// 消費者 : IDE(將影響編譯) /// </summary> public sealed class ConditionalTest { [Conditional("IsTest")] public void MyTestMethod() { Console.WriteLine("這是我的測試方法,請在正式上線后注釋掉"); } } }
此方法在2處調(diào)用
①:
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace AtrributeTest.com { /// <summary> /// 用于測試Obsolete特性 /// 目標(biāo):Method /// 消費者 : IDE /// </summary> public sealed class ObsoleteTest { [Obsolete("這個方法已經(jīng)過時,請使用MyNewMethod方法",false)] public void MyOldMethd() { Console.WriteLine("這是一個過時的方法"); } public void MyNewMethod() { Console.WriteLine("這是一個新方法"); ConditionalTest contTest = new ConditionalTest(); contTest.MyTestMethod(); } } }
②:Main函數(shù)
#define IsTest using System; using System.Collections.Generic; using System.Linq; using System.Text; using AtrributeTest.com; namespace AtrributeTest { public class Program { static void Main(string[] args) { Console.WriteLine("ObsoleteTest.........................."); ObsoleteTest obsTest = new ObsoleteTest(); obsTest.MyNewMethod(); Console.WriteLine("Program.........................."); ConditionalTest conTest = new ConditionalTest(); conTest.MyTestMethod(); Console.ReadKey(); } } }
在Program中我定義了一個宏 IsTest , 所以在此類的Main函數(shù)中MyTestMethod是可以被執(zhí)行的。但是在ObsoleteTest內(nèi)中沒有定義此宏,所以此類的方法MyNewMethod中的MyTestMethod是不會被執(zhí)行的。這點值得注意。實際上在IDE中已經(jīng)給予了提示:
在注冊過IsTest宏的Program類,如下圖:
在沒有注冊過宏IsTest宏的ObsoleteTest類,如下圖:
值得注意注意的是 ,① 宏一定要放在所有using的前面 ; ②宏的定義要與[Conditional("IsTest")]后面的參數(shù)一樣,但是不能要“”(引號)
但是如果整個項目的此Method都能/不能調(diào)用 , 單單一個個在Class中加/刪宏會累死你的 。這里本人有個好方法“預(yù)處理指令”在本人的博客《C#的預(yù)處理指令的全局設(shè)計》中有,但是還有一個此特性還有一個缺點:
所有引用(調(diào)用)此Method的地方不會被編譯,但是定義它的地方會被編譯。建議還是使用#if / #endif
自定義特性:(要注意三點)
一:需要繼承Attribute類
二:需要以Attribute單詞作為后綴名
三:最好申明為sealed,需要申明此特性的消費著
好,現(xiàn)在來整一個Demo,現(xiàn)在一步步實現(xiàn)
①建立第一個自定義特性,如下圖
②完整代碼:
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace AtrributeTest.com { /// <summary> /// 自定義一個特性 /// </summary> [AttributeUsage(AttributeTargets.Class)]//表示此特性可以應(yīng)用到那些程序結(jié)構(gòu) public sealed class MyTestAttribute : Attribute { private string des; public int Id { get; set; } public MyTestAttribute(string @des) { this.des = des; } } }
③使用自定義特性
注意 : 使用反射獲取特性信息
using System; using AtrributeTest.com; namespace AtrributeTest { [MyTest("我的第一個特性",Id = 1)] public class Program { private static void Main(string[] args) { Type @ty = typeof (Program); object[] arr = ty.GetCustomAttributes(false);//是否搜索父類上的特性 MyTestAttribute my = arr[0] as MyTestAttribute; Console.WriteLine("特性類的des : {0}" , my.des); Console.WriteLine("特性類的ID號 : {0}" ,my.Id); Console.ReadKey(); } } }
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。