C# #define條件編譯詳解。本站提示廣大學習愛好者:(C# #define條件編譯詳解)文章只能為提供參考,不一定能成為您想要的結果。以下是C# #define條件編譯詳解正文
本文導讀:
C#的預處置器指令歷來不會轉化為可執行代碼的命令,但是會影響編譯進程的各個方面,常用的預處置器指令有#define、#undef、#if,#elif,#else和#endif等等,上面引見C#中運用#define停止條件編譯的實例。
C#中條件編譯指令用於按條件包括或掃除源文件中的某些局部。在Visual Studio中,會看到被掃除的代碼顯示為灰色。
一、#define可以用來做什麼
1、當方案發布兩個版本的代碼的時分。即根本版和擁有更多版本的企業版,就可以用到條件編譯指令;
2、例好像一個文件給silverlight、wpf、winform等運用,並且還思索Debug和Release等,有大局部代碼是一樣的;
3、指定函數和屬性能否編譯到最終產品中去。
二、#define用法
語法:#define 稱號
留意:這裡稱號取Debug,你也可以取其他稱號如Dragon
#define Debug
闡明:
1、Debug可以看做是聲明的一個變量,但此變量沒有真正的值,存在時#if Debug後果為true,否則為false;
2、#define獨自用沒什麼意義,普通是和#if或許Conditional特性結合運用;
3、#define必需定義在一切using命名空間後面;
4、Debug與DEBUG是不同的,C#區分大小寫。
三、#define條件編譯實例
方式一、運用#if
#define Dragon
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;
namespace ConditionalCompilation
{
class Program
{
static void Main(string[] args)
{
#if Dragon
Console.WriteLine("Dragon is defined");
#else
Console.WriteLine("Dragon is not defined");
#endif
Console.ReadKey();
}
}
}
輸入後果如下:

假如正文掉 //#define Dragon ,輸入後果為:

方式二、運用Conditional特性
我們可以將一些函數隔離出來,使得它們只要在定義了某些環境變量或許設置了某個值之後才干發揚作用,運用Conditional特性的隔離戰略要比#if/#endif不容易出錯。
#define Debug
#define Trace
#if (Debug && Trace)
#define DebugAndTrace
#endif
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;
namespace ConditionalCompilation
{
class Program
{
static void Main(string[] args)
{
Print0();
Print1();
Print2();
Print3();
Console.ReadKey();
}
[Conditional("DEBUG")]
static void Print0()
{
Console.WriteLine("DEBUG is defined");
}
[Conditional("Debug")]
static void Print1()
{
Console.WriteLine("Debug is defined");
}
//定義了Debug或許Trace後才會執行此辦法
//或許的關系
[Conditional("Debug"), Conditional("Trace")]
static void Print2()
{
Console.WriteLine("Debug or Trace is defined");
}
//只要定義了Debug和Trace後才會執行此辦法
//並且的關系
[Conditional("DebugAndTrace")]
static void Print3()
{
Console.WriteLine("Debug and Trace is defined");
}
}
}
輸入後果如下:

闡明:
1、代碼中沒有定義DEBUG,卻輸入了DEBUG,是由於DEBUG版本,自動定義了DEBUG。“項目——右鍵——屬性——生成選項卡——慣例欄”下的定義 DEBUG 常量(U)後面的復選框被選中。當然你可以去掉其選中形態,這樣就不會輸入DEBUG了。
2、假如Debug和Trace均沒有定義,則不會輸入Debug or Trace;只要Debug和Trace均定義了,才會輸入Debug and Trace。
3、可以給Conditional添加多個屬性如示例代碼 [Conditional("Debug"), Conditional("Trace")] ,不過多個屬性之間的關系是或的關系,即“Debug”或許“Trace”恣意一個被定義了,那麼對應辦法就會被執行。
4、假如需求添加多個與的屬性,直接用Conditional是無法完成的,需求借助#if/#endif直接來完成,如示例代碼中的組合操作
#if (Debug && Trace) #define DebugAndTrace #endif
運用Conditional屬性的辦法遭到以上限制:
1、條件辦法必需是類聲明或構造聲明中的辦法。假如在接口聲明中的辦法上指定Conditional屬性,將呈現編譯時錯誤;
2、條件辦法不能是接口辦法的完成。否則將發作編譯時錯誤;
3、條件辦法必需具有void前往類型;
4、不能用override修飾符標志條件辦法。但是,可以用virtual修飾符標志條件辦法。此類辦法的重寫辦法隱含為有條件的辦法,而且不能用Conditional屬性顯式標志。
環境變量(或條件編譯符號)的設置辦法有三:
1)用#define定義以及#undef取消定義,在一切using命名空間後面定義;
2)用編譯器命令行選項(例如,/define:DEBUG),在“項目——右鍵——屬性——生成選項卡——慣例欄”下的條件編譯符號(Y)中設置(假如多個,可以用英文逗號隔開)。DEBUG版本下,零碎默許設置了DEBUG和TRACE;
3)用操作零碎外殼順序中的環境變量(例如,set DEBUG=1)。
以上就是本文的全部內容,希望對大家的學習有所協助,也希望大家多多支持。