.NET/C# 使用 #if 和 Conditional 特性進行條件編譯

.NET/C# 使用 #if 和 Conditional 特性來按條件編譯代碼的不同原理和適用場景

發佈於 2023-10-22 10:33:36
1690
舉報

有小夥伴看到我有時寫了 #if 有時寫了 [Conditional] 問我兩個不是一樣的嗎,何必多此一舉。然而實際上兩者的編譯處理是不同的,因此也有不同的應用場景。

於是我寫到這篇文章當中。


條件編譯符號和預處理符號

我們有時會使用 #if DEBUG 或者 [Conditional("DEBUG")] 來讓我們的代碼僅在特定的條件下編譯。

而這裏的 DEBUG 是什麼呢?

  • 在我們編寫的 C# 代碼中,這個叫做 “條件編譯符號”(Conditional compilation symbols)
  • 在項目的構建過程中,這個叫做 “定義常量”(Define constants)
  • 而在將 C# 代碼編譯到 dll 的編譯環節,這個叫做 “預處理符號”(Preprocessor symbols)

本文要討論的是 #ifConditional 的使用,這是在 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 使用——讓目標項目(或者程序集)僅在目標項目特定的配置下才會編譯。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章