最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2015年01月05日 10:12:45   投稿:junjie  
這篇文章主要介紹了C#中的預處理器指令詳解,本文講解了#define 和 #undef、#if、#elif、#else和#endif、#warning和#error、#region和#endregion、#line、#pragma等預處理器指令,需要的朋友可以參考下

目錄

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

  C#中有許多名為“預處理器指令”的命令。這些命令從來不會轉(zhuǎn)化為可執(zhí)行代碼中的命令,但會影響編譯過程的各個方面。

  例如,使用預處理器指令可以禁止編譯器編譯代碼的某一部分。如果計劃發(fā)布兩個版本的代碼,即基本版本和擁有更多功能的企業(yè)版本,就可以使用這些預處理器指令。在編譯軟件的基本版本時,使用預處理器指令可以禁止編譯器編譯與額外功能相關的代碼。

  另外,在編寫提供調(diào)試信息的代碼時,也可以使用預處理器指令。實際上,在銷售軟件時,一般不希望編譯這部分代碼。

  預處理器指令的開頭都有符號#。

  C++開發(fā)人員應知道,在C 和C++中預處理器指令非常重要,但是,在C#中,并沒有那么多的預處理器指令,它們的使用也不太頻繁。C#提供了其他機制來實現(xiàn)許多C++指令的功能,如定制特性。還要注意,C#并沒有一個像C++那樣的獨立預處理器,所謂的預處理器指令實際上是由編譯器處理的。

  盡管如此,C#仍保留了一些預處理器指令名稱,因為這些命令會讓人覺得就是預處理器。

  下面簡要介紹預處理器指令的功能。

 
1. #define 和 #undef

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

  它告訴編譯器存在給定名稱的符號,在本例中是DEBUG。這有點類似于聲明一個變量,但這個變量并沒有真正的值,只是存在而已。

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


  #undef 正好相反—— 它刪除符號的定義: #undef DEBUG

  如果符號不存在,#undef 就沒有任何作用。同樣,如果符號已經(jīng)存在,則#define 也不起作用。必須把#define 和#undef 命令放在C#源文件的開頭位置,在聲明要編譯的任何對象的代碼之前。

  #define 本身并沒有什么用,但與其他預處理器指令(特別是#if)結(jié)合使用時,它的功能就非常強大了。

  這里應注意一般C#語法的一些變化。預處理器指令不用分號結(jié)束,一般一行上只有一條命令。這是因為對于預處理器指令,C#不再要求命令使用分號進行分隔。如果它遇到一條預處理器指令,就會假定下一條命令在下一行上。


2. #if、#elif、#else 和#endif
  這些指令告訴編譯器是否要編譯某個代碼塊??紤]下面的方法:

復制代碼 代碼如下:

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

  這段代碼會像往常那樣編譯,但Console.WriteLine 命令包含在#if 子句內(nèi)。

  這行代碼只有在前面的#define 命令定義了符號DEBUG 后才執(zhí)行。

  當編譯器遇到#if 語句后,將先檢查相關的符號是否存在,如果符號存在,就編譯#if 子句中的代碼。否則,編譯器會忽略所有的代碼,直到遇到匹配的#endif 指令為止。

  一般是在調(diào)試時定義符號DEBUG,把與調(diào)試相關的代碼放在#if 子句中。在完成了調(diào)試后,就把#define 語句注釋掉,所有的調(diào)試代碼會奇跡般地消失,可執(zhí)行文件也會變小,最終用戶不會被這些調(diào)試信息弄糊涂(顯然,要做更多的測試,確保代碼在沒有定義DEBUG 的情況下也能工作)。

  這項技術(shù)在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,當編譯器遇到它們時,會分別產(chǎn)生警告或錯誤。如果編譯器遇到#warning 指令,會給用戶顯示#warning 指令后面的文本,之后編譯繼續(xù)進行。如果編譯器遇到#error 指令,就會給用戶顯示后面的文本,作為一條編譯錯誤消息,然后會立即退出編譯,不會生成IL 代碼。

  使用這兩條指令可以檢查#define 語句是不是做錯了什么事,使用#warning 語句可以提醒自己執(zhí)行某個操作:

復制代碼 代碼如下:

#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

  這看起來似乎沒有什么用,它不影響編譯過程。這些指令的優(yōu)點是它們可以被某些編輯器識別,包括Visual Studio .NET 編輯器。這些編輯器可以使用這些指令使代碼在屏幕上更好地布局。

5. #line
  #line 指令可以用于改變編譯器在警告和錯誤信息中顯示的文件名和行號信息。這條指令用得并不多。

  如果編寫代碼時,在把代碼發(fā)送給編譯器前,要使用某些軟件包改變輸入的代碼,就可以使用這個指令,因為這意味著編譯器報告的行號或文件名與文件中的行號或編輯的文件名不匹配。

  #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 指令可以在類或方法級別執(zhí)行,對抑制警告的內(nèi)容和抑制的時間進行更精細的控制。

  下面的例子禁止“字段未使用”警告,然后在編譯MyClass 類后還原該警告。

復制代碼 代碼如下:

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

感謝大家收看,謝謝親們了。

相關文章

  • C#畫筆Pen繪制曲線的方法

    C#畫筆Pen繪制曲線的方法

    這篇文章主要介紹了C#畫筆Pen繪制曲線的方法,主要涉及C#畫筆中DrawCurve方法的使用技巧,需要的朋友可以參考下
    2015-06-06
  • C#讀取Excel并轉(zhuǎn)化成XML的方法

    C#讀取Excel并轉(zhuǎn)化成XML的方法

    這篇文章主要介紹了C#讀取Excel并轉(zhuǎn)化成XML的方法,實例分析了C#操作Excel及XML文件的技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-04-04
  • 詳解C#讀寫Excel的幾種方法

    詳解C#讀寫Excel的幾種方法

    這篇文章主要介紹了詳解C#讀寫Excel的幾種方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-12-12
  • C#如何將Excel轉(zhuǎn)換為PDF

    C#如何將Excel轉(zhuǎn)換為PDF

    這篇文章主要介紹了C#如何將Excel轉(zhuǎn)換為PDF問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • C#生成DLL文件的方法

    C#生成DLL文件的方法

    這篇文章主要介紹了C#生成DLL文件的方法,較為詳細的分析了使用C#生成DLL文件所涉及的相關技巧與實現(xiàn)方法,需要的朋友可以參考下
    2015-07-07
  • C#文件下載實例代碼(適用于各個瀏覽器)

    C#文件下載實例代碼(適用于各個瀏覽器)

    本文給大家分享一段實例代碼關于css實現(xiàn)文件下載功能,需要的的朋友參考下吧
    2017-05-05
  • C#導出生成excel文件的方法小結(jié)(xml,html方式)

    C#導出生成excel文件的方法小結(jié)(xml,html方式)

    C#導出生成excel文件的方法小結(jié)(xml,html方式)。需要的朋友可以過來參考下,希望對大家有所幫助
    2013-10-10
  • C#中調(diào)用SAPI實現(xiàn)語音識別的2種方法

    C#中調(diào)用SAPI實現(xiàn)語音識別的2種方法

    這篇文章主要介紹了C#中調(diào)用SAPI實現(xiàn)語音識別的2種方法,本文直接給出實現(xiàn)代碼,需要的朋友可以參考下
    2015-06-06
  • c#繼承與多態(tài)使用示例

    c#繼承與多態(tài)使用示例

    繼承是面向?qū)ο蟪绦蛟O計的主要特征之一,允許重用現(xiàn)有類去創(chuàng)建新類的過程。下面使用示例學習一下c#繼承與多態(tài)
    2014-01-01
  • C#圖片處理3種高級應用

    C#圖片處理3種高級應用

    本文介紹C#圖片處理高級應用,這些功能并無多大技術(shù)含量。全部基于.Net Framework類庫完成,代碼中包含了C#圖片處理的一些基礎知識,與大家分享,個人能力有限,不足之處還請及時指正。
    2015-10-10

最新評論

黄大仙区| 肃南| 营口市| 乳源| 南丰县| 玉山县| 育儿| 丹寨县| 泉州市| 三河市| 蒙自县| 青浦区| 裕民县| 高平市| 宜黄县| 浏阳市| 调兵山市| 喀喇沁旗| 隆回县| 抚松县| 惠安县| 伊春市| 东海县| 新河县| 石屏县| 龙山县| 曲水县| 康定县| 开平市| 中宁县| 襄垣县| 平果县| 清镇市| 三门县| 额尔古纳市| 城步| 西丰县| 罗城| 钟祥市| 西乌| 芒康县|