#if 预处理指令用于除DEBUG以外的其他指令。

48

我知道可以使用预处理指令通过执行以下操作来检查Debug/Release:

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

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

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

那么,我的问题是在C#中如何检查测试模式?如果我处于Debug和Test模式下,我有一些代码想要执行,但不在Release模式下,因此我需要一种方法来检查是否不处于Release模式。在VB中,我会这样做:

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

77

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

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

#if TEST
// ...
#endif

如果您不想在TEST构建配置中运行某些代码,可以选择要么使用#else,要么执行以下操作:

#if !TEST
// ...
#endif

12
我之前不知道在“Build”选项卡下设置“Conditional compilation symbols”的方法,这正是我想要的!谢谢!顺便加一分,因为你解释了如何设置这些符号。 - Johnie Karr
1
我已经将“TEST”添加到我的单元测试项目的条件编译符号中,以便使用#if !TEST将一些仅适用于应用程序的代码包装起来,并在运行测试时不运行它,但它仍在执行。我在这里漏掉了什么? - Chucky

12

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

进入属性项,然后进入构建选项卡。

接下来,在文本框中添加您的自定义指令。例如,我已将“Local”添加为我的自定义指令,请参见下面的图像。

输入图像描述

现在您可以在 C# 中按照以下示例使用新的编译器指令:

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

1
我们可以使用每个用户的配置而不是项目配置吗? - Manish Rawat

4
处理因子的方法有几种,我们通常使用以下四种技术:
  1. 编译器标志(#if
  2. 分部类
  3. 分离实现
  4. 运行时决策
例如,我们为 C# 和 Silverlight 等不同构建配置添加了编译时符号UNMANAGEDMANAGEDSILVERLIGHT。这使得我可以将小任务注入到代码中,并在所有项目中共享相同的文件。对于分部类,我们为每个项目使用单独的 .cs 文件来实现边缘代码。对于分离实现,我们承认代码库之间几乎没有可共享的内容,最好使用独立的代码。对于运行时检查,就是做一个设置的运行时检查,而不是在#if中检查DEBUG。 除非你拥有庞大的调试脚手架,否则这不是一个坏选择,因为它还可以让你进行现场调试(但你可能会有阻止此功能的交付约束)。在个人看来,尽量避免使用编译器标志,因为它们使代码更难阅读。然而,有时候使用它们是有意义的。我们曾经遇到过因为类声明(我认为是 ObservableCollection 不可用)而无法在 Silverlight 中编译某些类的情况,所以我们不得不从其它类继承。其他所有事情都运行良好。

2

简单的答案是

  • 进入项目 -> [项目名称] 属性 -> 构建
  • 勾选 [] 定义 DEBUG

现在你可以操作 DEBUG 前置指令了,例如:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接