#if预处理程序指令,用于DEBUG以外的指令

我知道我可以通过这样做来使用预处理器指令来检查Debug / Release:

#if DEBUG //debug mode #elif //release mode #endif 

但是如何检查其他配置,比如Test。 在VB中你可以这样做:

 #If CONFIG = "Release" Then 'Release mode #ElseIf CONFIG = "Test" Then 'Test mode #ElseIf CONFIG = "Debug" Then 'Debug mode #End If 

所以,我的问题是在C#中,我该如何检查测试模式? 如果我在调试和测试中,我有一些代码要执行,但不是在发布模式下,所以具体来说,我需要一种方法来检查是否处于发布模式。 在VB中我会这样做:

 #If Not CONFIG = "Release" Then 'Do something here for every configuration that is not Release #End If 

它与DEBUG相同, 假设您已在“条件编译符号”文本框中定义了一个列出TEST的构建配置 (在项目属性>构建选项卡下;这是一个以空格分隔的列表)。

对于您只想在TEST构建配置中运行的代码:

 #if TEST // ... #endif 

对于您不想在TEST构建配置中运行的代码,您可以#else以上,或者执行以下操作:

 #if !TEST // ... #endif 

有几种方法可以处理您的因子。 在我的世界里,我们使用了四种主要技术:

  1. 编译器标志( #if
  2. 部分课程
  3. 单独的实现
  4. 运行时决定

例如,我们为C#构建配置,使用非托管代码,C#使用所有托管代码,C#使用Silverlight。 在C#unmanaged项目中,我们有一个编译时符号UNMANAGED ,对于C#,我们有MANAGED ,对于silverlight我们有SILVERLIGHT 。 这使我可以将小任务注入代码并在所有项目中共享相同的文件。 没什么大不了。

对于部分类,我们为每个具有边缘代码实现的项目都有单独的.cs文件。 在我们无法通过将抽象类作为具有大部分实现的父类,然后在每个目标的具体类中使用边缘代码来实现这项工作的情况下使用它。 这很好用。

对于单独的实现,我们承认代码库之间几乎没有共享,我们最好使用单独的代码。 这不是理想的,但也是如此。

对于运行时检查,就是这样。 而不是在#if检查DEBUG ,而是使用运行时检查来进行设置以进行该选择。 除非你有非常庞大的调试脚手架,否则这不是一个糟糕的选择,因为它还允许你进行现场调试(但是你可能有阻止它的传输约束)。

就个人而言,我试图避免编译器标志。 它们使代码更难阅读。 但老实说,有时它们才有意义。 由于类声明(我认为ObservableCollection不可用),我们已经有了不能在Silverlight中编译的类,我们不得不inheritance其他东西。 其他一切都很好。

右键单击要使用自定义预编译器指令的Project [项目名称]名称。

转到属性项,然后转到构建选项卡。

那么你需要在文本框中添加自定义指令。 例如,我添加了’Local’作为我的自定义指令,见下图

在此处输入图像描述

现在您可以使用新的编译器指令,如下所示(在C#中)

  #if **Local** //TODO:Add your c# code here #endif 

简单的答案是

  • 转到项目 – > [项目名称]属性 – >构建
  • 设置选中[]定义DEBUG

现在您可以使用DEBUG前身指令了

 #if DEBUG ... #else ... #endif