我想执行以下操作,但使用 C# 而不是 C++
#ifdef _DEBUG
bool bypassCheck=TRUE_OR_FALSE;//i will decide depending on what i am debugging
#else
bool bypassCheck = false; //NEVER bypass it
#endif
#if DEBUG
bool bypassCheck=TRUE_OR_FALSE;//i will decide depending on what i am debugging
#else
bool bypassCheck = false; //NEVER bypass it
#endif
确保您在构建属性中选中了定义 DEBUG 的复选框。
我建议您使用条件属性!
更新:3.5年后
您可以像这样使用
#if
(从MSDN复制的示例):
// preprocessor_if.cs
#define DEBUG
#define VC_V7
using System;
public class MyClass
{
static void Main()
{
#if (DEBUG && !VC_V7)
Console.WriteLine("DEBUG is defined");
#elif (!DEBUG && VC_V7)
Console.WriteLine("VC_V7 is defined");
#elif (DEBUG && VC_V7)
Console.WriteLine("DEBUG and VC_V7 are defined");
#else
Console.WriteLine("DEBUG and VC_V7 are not defined");
#endif
}
}
仅适用于排除部分方法。
如果您使用
#if
从编译中排除某些方法,那么您将必须从编译中排除所有调用该方法的代码片段(有时您可能会在运行时加载一些类,并且无法使用“查找所有参考”)。否则会出现错误。
另一方面,如果您使用条件编译,您仍然可以保留调用该方法的所有代码片段。所有参数仍将由编译器验证。 该方法不会在运行时被调用。我认为最好只隐藏该方法一次,而不必删除调用它的所有代码。不允许在返回值的方法上使用条件属性 - 只能在 void 方法上使用。但我不认为这是一个很大的限制,因为如果您将
#if
与返回值的方法一起使用,则必须隐藏所有调用它的代码。
这是一个例子:
// 调用Class1.ConditionalMethod()将在运行时被忽略 // 除非定义了 DEBUG 常量 使用系统诊断; 等级1级 { [条件(“调试”)] 公共静态无效条件方法(){ Console.WriteLine("执行了Class1.ConditionalMethod"); } }
总结:
我会在 C++ 中使用
#ifdef
,但在 C#/VB 中我会使用条件属性。通过这种方式,您可以隐藏方法定义,而不必隐藏调用它的代码片段。调用代码仍然由编译器编译和验证,但该方法不会在运行时调用。
您可能需要使用 #if
来避免依赖关系,因为使用 Conditional 属性您的代码仍会编译。
C# 确实有一个预处理器。它的工作原理与此略有不同 C++ 和 C。
这里是 MSDN 链接 - 关于所有预处理器指令的部分。
我能够通过将
<DefineConstants>
标签添加到 csproj 的 xml 中来实现该行为。
<PropertyGroup>
。<DefineConstants>SOME_VARIABLE_NAME</DefineConstants>
。#if SOME_VARIABLE_NAME
添加到您的代码中以有条件地启用该代码。