現在我自己測試了一下,也查閱了msdn,有點心得,說出來與大家分享。
conditional其實是乙個屬性類:conditionalattribute的簡稱。可應用於方法或者屬性類。最常見的用法想必大家都知道:
[conditional("conditiona")]
public static void test()
用方法前置屬性的方式來替換原有寫法:public static void test()
其實這邊有個很大的陷阱:那就是上面兩種的寫法並不等價!用conditional屬性的方式,test方法是否生效是取決於呼叫方,而用#if方式,test方法是否生效是取決於方法定義所在的程式集。請看下圖:
fuc.test()是定義在conditionaltest程式集的乙個static方法,如果csharptest程式集中的**想要成功的呼叫test方法,那麼應該在csharptest程式集中定義conditional巨集,否則永遠無法呼叫成功,而func.testtwo()中的內容方法想要被成功執行,那麼應該在conditionaltest定義conditional巨集,跟其他程式集無關。巨集定義的設定:右擊工程->屬性->生成->條件編譯符號:
也就是說conditional能夠根據函式呼叫方的環境不同來選擇是否執行,而#if是根據本程式集是否有配置相應巨集定義來判斷是否執行。
conditional還可以同時使用多個識別符號,書寫的方式有兩種:
[conditional("a"), conditional("b")]
static void doifaorb()
或者:
[conditional("a")]
[conditional("b")]
static void doifaorb()
這些符號彼此之間存在邏輯的「或」關係,上面的兩種寫法,a或b的存在豆漿導致方法呼叫。
但是符號之間並不能進行「與」操作,如果要獲得對符號進行「與」操作的效果,可以定義序列條件的方法:例如,僅當a和b都已定義時,才能執行下面的第二種方法:
[conditional("a")]
static void doifa()
[conditional("b")]
static void doifaandb()
除此之外,conditional還可以被應用於屬性類定義。**如下:
[conditional("debug")]
public class documentation : system.attribute
}class sampleclass
}
在上例中,僅當定義了debug時,自定義屬性documentation才向元資料新增資訊。
結論:並不能簡單的說用conditional來替代#if,因為兩者的功能不盡相同,得根據情況具體分析。推薦使用conditional的好處之一是讓**更加具有閱讀性,但是本人認為如果並不是簡單的#if,而是#if...#elif...#else...#endif這種邏輯性很強的**的話,那麼建議採用#if的寫法,因為這樣**可讀性反而更強。
最後還有一點要說的是,作為dll引入的話,conditional的用法會直接體現在類**宣告中,而#if不會有任何的體現,因為在編譯器在編譯的時候會根據是否有定義相應的巨集定義來確定最終生成的**:
c Conditional用法詳解
現在我自己測試了一下,也查閱了msdn,有點心得,說出來與大家分享。conditional conditiona public static void test 用方法前置屬性的方式來替換原有寫法 public static void test 其實這邊有個很大的陷阱 那就是上面兩種的寫法並不等價!...
nginx limit req zone用法詳解
nginx可以使用ngx http limit req module模組的limit req zone指令進行限流訪問,防止使用者惡意攻擊刷爆伺服器。ngx http limit req module模組是nginx預設安裝的,所以直接配置即可。首先,在nginx.conf檔案中的http模組下配置...
優先佇列priority queue 用法詳解
優先佇列是佇列的一種,不過它可以按照自定義的一種方式 資料的優先順序 來對佇列中的資料進行動態的排序 每次的push和pop操作,佇列都會動態的調整,以達到我們預期的方式來儲存。例如 我們常用的操作就是對資料排序,優先佇列預設的是資料大的優先順序高 所以我們無論按照什麼順序push一堆數,最終在佇列...