《刻意練習之C#》-0016- C#預處理器指令

預處理指令javascript

這些指令/命令不會轉換爲可執行代碼,但會影響編譯過程的各個方面;列如,能夠讓編譯器不編譯某一部分代碼等。java

C#中主要的預處理指令編程

#define和#undefbash

#define指令定義app

#define DEBUG

它告訴編譯器存在DEBUG這個符號;這個符號不是實際代碼的一部分,而只是在編譯器編譯代碼時候可能會根據這個符號作條件編譯。學習

#undef定義:ui

#undef DEBUG

用來移除定義的符號DEBUG。若是不存在這樣的標記,#undef指令則不會生效。一樣,用#define再次定義一個同名的標記也不會有任何變化。this

注意:spa

  1. 你須要將#define和#undef指令寫在實際業務代碼開始以前的位置。
  2. #define自己沒有什麼用,須要和其餘預處理器指令結合使用;好比 #if

#if, #elif, #else和#endif命令行

這些指令告訴編譯器是否要編譯包含在其中的代碼塊。例如:

int DoSomeWork(double x)
{
	// do something
	#if DEBUG
		Console.WriteLine($"x is {x}");
	#endif
}

這段代碼中的Console.Writeline語句,只有在前面用#define指令定義了符號DEBUG後纔會在編譯的時候,真正被編譯到;

若是編譯器沒發現DEBUG符號,就會在編譯的時候忽略這句代碼。 

#elif(= else if)和#else指令能夠用在#if塊中:

#define ENTERPRISE
#define W10
// further on in the file
#if ENTERPRISE
// do something
	#if W10
	// some code that is only relevant to enterprise
	// edition running on W10
	#endif
#elif PROFESSIONAL
// do something else
#else
// code for the leaner version
#endif

#if和#elif還支持有限的一些邏輯操做符,你能夠用使用!,==,!=和||等。

一個標記若是存在,則認爲是true,若是沒有定義,就認爲是false,所以你也能夠這樣使用:

#if W10 && (ENTERPRISE==false) // if W10 is defined but ENTERPRISE isn't

 

#warning和#error

 當編譯器遇到#warning的時候,會產生警告信息;

當編譯器遇到#error的時候,會產生錯誤信息;

    class Program
    {
        static void Main(string[] args)
        {

#warning this is a warning message which will be shown when compile

            Console.WriteLine("Hello World!");

#error this is a error message, and will break build
        }
    }

  編譯結果:

Program.cs(10,10): warning CS1030: #warning: 'this is a warning message which will be shown when compile' [/define_warning/define_warning.csproj]
Program.cs(14,8): error CS1029: #error: 'this is a error message, and will break build' [/define_warning/define_warning.csproj]
    1 Warning(s)
    1 Error(s)

  使用這些指令能夠檢查#define語句是否是作錯了什麼事,使用#warning能夠提醒要作些事情:

#if DEBUG && RELEASE
#error "You've defined DEBUG and RELEASE simultaneously!"
#endif
#warning "Don't forget to remove this line before the boss tests the code!"
Console.WriteLine("*I love this job.*");

  

#region和#endregion

 能夠用來標識一段代碼,在Visual Studio或其餘可以識別的IDE裏比較有用。

#region Member Field Declarations
int x;
double d;
Currency balance;
#endregion

  

#line

 #line指令能夠用來改變編譯器輸出警告和錯誤時相應的文件名和行號信息。這個實際中,用的可能會比較少。

主要是在用第三方包的時候,有時候會致使編譯器報告的行號或文件名與實際不匹配。

#line能夠用於還原這種匹配。

#line 164 "Core.cs" // We happen to know this is line 164 in the file Core.cs, 
// before the intermediate package mangles it.
// later on
#line default // restores default line numbering

  

#pragma

 #pragma指令能夠用來終止或恢復某個指定編號到編譯器警告。

與命令行選項不一樣,#pragma指令能夠在類或方法級別實現。

例如:

    class Program
    {
        static void Main(string[] args)
        {
            int i = 0;
            Console.WriteLine("Hello World!");
        }
    }

  編譯是會有warning:

Program.cs(9,17): warning CS0219: The variable 'i' is assigned but its value is never used [/define_warning/define_warning.csproj]
    1 Warning(s)
    0 Error(s)  

 從warning信息能夠看出是warning CS0219,加入#pragma後就不會有warning了。

#pragma warning disable CS0219
    public class Program
    {
        static void Main(string[] args)
        {
            int i = 0;
            Console.WriteLine("Hello World!");
        }
    }
#pragma warning restore CS0219

 注意:warning的代碼是區分大小寫的,CS2019要大寫,若是寫成cs2019則沒有用。 

 

學習資料

C#高級編程(第11版) C# 7 & .NET Core 2.0(.NET開發經典名著)

相關文章
相關標籤/搜索