.NET/C# 使用 #if 和 Conditional 特性來按條件編譯代碼的不同原理和適用場景
有小夥伴看到我有時寫了 #if
有時寫了 [Conditional]
問我兩個不是一樣的嗎,何必多此一舉。然而實際上兩者的編譯處理是不同的,因此也有不同的應用場景。
於是我寫到這篇文章當中。
條件編譯符號和預處理符號
我們有時會使用 #if DEBUG
或者 [Conditional("DEBUG")]
來讓我們的代碼僅在特定的條件下編譯。
而這裏的 DEBUG
是什麼呢?
- 在我們編寫的 C# 代碼中,這個叫做 “條件編譯符號”(Conditional compilation symbols)
- 在項目的構建過程中,這個叫做 “定義常量”(Define constants)
- 而在將 C# 代碼編譯到 dll 的編譯環節,這個叫做 “預處理符號”(Preprocessor symbols)
本文要討論的是 #if
和 Conditional
的使用,這是在 C# 代碼中的使用場景,因此,本文後面都將其稱之爲 “條件編譯符號”。
區別
#if
1 2 3 4 5 |
#if DEBUG Console.WriteLine("歡迎來 blog.walterlv.com 來做客呀!"); #endif |
---|
在這段代碼中,#if DEBUG
和 #endif
之間的代碼僅在 DEBUG 下會編譯,在其他配置下是不會編譯的。
Conditional
1 2 3 4 5 |
[Conditional("DEBUG")] public void Foo() { Console.WriteLine("歡迎來 blog.walterlv.com 來做客呀!"); } |
---|
而這段代碼,是會被編譯到目標程序集中的。它影響的,是調用這個方法的代碼。調用這個方法的代碼,僅在 DEBUG 下會編譯,在其他配置下是不會編譯的。
場景
因爲 #if DEBUG
和 #endif
僅僅影響包含在其內的代碼塊,因此其僅僅影響寫的這點代碼所在的項目(或者說程序集)。於是使用 #if
只會影響實現代碼。
而 [Conditional("DEBUG")]
影響的是調用它的代碼,因此可以設計作爲 API 使用——讓目標項目(或者程序集)僅在目標項目特定的配置下才會編譯。