程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C#中的預處置器指令詳解

C#中的預處置器指令詳解

編輯:C#入門知識

C#中的預處置器指令詳解。本站提示廣大學習愛好者:(C#中的預處置器指令詳解)文章只能為提供參考,不一定能成為您想要的結果。以下是C#中的預處置器指令詳解正文


目次

1. #define 和 #undef
2. #if、#elif、#else 和#endif
3. #warning 和 #error
4. #region 和#endregion
5. #line
6. #pragma

  C#中有很多名為“預處置器指令”的敕令。這些敕令歷來不會轉化為可履行代碼中的敕令,但會影響編譯進程的各個方面。

  例如,應用預處置器指令可以制止編譯器編譯代碼的某一部門。假如籌劃宣布兩個版本的代碼,即根本版本和具有更多功效的企業版本,便可以應用這些預處置器指令。在編譯軟件的根本版本時,應用預處置器指令可以制止編譯器編譯與額定功效相干的代碼。

  別的,在編寫供給調試信息的代碼時,也能夠應用預處置器指令。現實上,在發賣軟件時,普通不願望編譯這部門代碼。

  預處置器指令的開首都有符號#。

  C++開辟人員應曉得,在C 和C++中預處置器指令異常主要,然則,在C#中,並沒有那末多的預處置器指令,它們的應用也不太頻仍。C#供給了其他機制來完成很多C++指令的功效,如定制特征。還要留意,C#並沒有一個像C++那樣的自力預處置器,所謂的預處置器指令現實上是由編譯器處置的。

  雖然如斯,C#仍保存了一些預處置器指令稱號,由於這些敕令會讓人認為就是預處置器。

  上面扼要引見預處置器指令的功效。

 
1. #define 和 #undef

  #define 的用法以下所示: #define DEBUG

  它告知編譯器存在給命名稱的符號,在本例中是DEBUG。這有點相似於聲明一個變量,但這個變量並沒有真實的值,只是存在罷了。

  這個符號不是現實代碼的一部門,而只在編譯器編譯代碼時存在。在C#代碼中它沒有任何意義。


  #undef 正好相反—— 它刪除符號的界說: #undef DEBUG

  假如符號不存在,#undef 就沒有任何感化。異樣,假如符號曾經存在,則#define 也不起感化。必需把#define 和#undef 敕令放在C#源文件的開首地位,在聲明要編譯的任何對象的代碼之前。

  #define 自己並沒有甚麼用,但與其他預處置器指令(特殊是#if)聯合應用時,它的功效就異常壯大了。

  這裡應留意普通C#語法的一些變更。預處置器指令不消分號停止,普通一行上只要一條敕令。這是由於關於預處置器指令,C#不再請求敕令應用分號停止分隔。假如它碰到一條預處置器指令,就會假定下一條敕令鄙人一行上。


2. #if、#elif、#else 和#endif
  這些指令告知編譯器能否要編譯某個代碼塊。斟酌上面的辦法:


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

  這段代碼會像平常那樣編譯,但Console.WriteLine 敕令包括在#if 子句內。

  這行代碼只要在後面的#define 敕令界說了符號DEBUG 後才履行。

  當編譯器碰到#if 語句後,將先檢討相干的符號能否存在,假如符號存在,就編譯#if 子句中的代碼。不然,編譯器會疏忽一切的代碼,直到碰到婚配的#endif 指令為止。

  普通是在調試時界說符號DEBUG,把與調試相干的代碼放在#if 子句中。在完成了調試後,就把#define 語句正文失落,一切的調試代碼會事業般地消逝,可履行文件也會變小,終究用戶不會被這些調試信息弄懵懂(明顯,要做更多的測試,確保代碼在沒有界說DEBUG 的情形下也能任務)。

  這項技巧在C 和C++編程中非常罕見,稱為前提編譯(conditional compilation)。

  #elif (=else if)和#else 指令可以用在#if 塊中,其寄義異常直不雅。也能夠嵌套#if 塊:


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

 
與C++中的情形分歧,應用#if 不是有前提地編譯代碼的獨一方法,C#還經由過程Conditional 特征供給了另外一種機制。

#if 和#elif 還支撐一組邏輯運算符“!”、“==”、“!=”和“||”。假如符號存在,就被以為是true,不然為false,例如:


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

3. #warning 和 #error

  另兩個異常有效的預處置器指令是#warning 和#error,當編譯器碰到它們時,會分離發生正告或毛病。假如編譯器碰到#warning 指令,會給用戶顯示#warning 指令前面的文本,以後編譯持續停止。假如編譯器碰到#error 指令,就會給用戶顯示前面的文本,作為一條編譯毛病新聞,然後會立刻加入編譯,不會生成IL 代碼。

  應用這兩條指令可以檢討#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 hate this job.*");

4. #region 和#endregion
  #region 和#endregion 指令用於把一段代碼標志為有給命名稱的一個塊,以下所示。


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

  這看起來仿佛沒有甚麼用,它不影響編譯進程。這些指令的長處是它們可以被某些編纂器辨認,包含Visual Studio .NET 編纂器。這些編纂器可使用這些指令使代碼在屏幕上更好地結構。

5. #line
  #line 指令可以用於轉變編譯器在正告和毛病信息中顯示的文件名和行號信息。這條指令用得其實不多。

  假如編寫代碼時,在把代碼發送給編譯器前,要應用某些軟件包轉變輸出的代碼,便可以應用這個指令,由於這意味著編譯器申報的行號或文件名與文件中的行號或編纂的文件名不婚配。

  #line 指令可以用於復原這類婚配。也能夠應用語法#line default 把行號復原為默許的行號:


#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

6. #pragma
  #pragma 指令可以克制或復原指定的編譯正告。與敕令行選項分歧,#pragma 指令可以在類或辦法級別履行,對克制正告的內容和克制的時光停止更精致的掌握。

  上面的例子制止“字段未應用”正告,然後在編譯MyClass 類後復原該正告。


#pragma warning disable 169
public class MyClass
{
  int neverUsedField;
}
#pragma warning restore 169

感激年夜家收看,感謝親們了。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved