我想在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
答案 0 :(得分:159)
#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的复选框。
答案 1 :(得分:46)
我建议您使用Conditional Attribute!
更新:3。5年后
您可以像这样使用#if
(example copied from 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
方法返回一个值,你必须隐藏所有调用它的代码片段。
以下是一个例子:
// calling Class1.ConditionalMethod() will be ignored at runtime // unless the DEBUG constant is defined using System.Diagnostics; class Class1 { [Conditional("DEBUG")] public static void ConditionalMethod() { Console.WriteLine("Executed Class1.ConditionalMethod"); } }
<强>要点:强>
我会在C ++中使用#ifdef
但是使用C#/ VB我会使用Conditional属性。这样,您可以隐藏方法定义,而无需隐藏调用它的代码片段。调用代码仍由编译器编译和验证,但该方法在运行时不会被调用。
您可能希望使用#if
来避免依赖,因为使用Conditional属性您的代码仍然会被编译。
答案 2 :(得分:43)
#if
将成为你的新朋友。
如果要定义自己的自定义编译符号,可以在项目属性中执行此操作(在“构建”选项卡上;“条件编译符号”)。
答案 3 :(得分:1)
C#确实有一个预处理器。它的工作方式略有不同 C ++和C。
以下是MSDN链接 - all preprocessor directives上的部分。
答案 4 :(得分:0)
我能够通过将 <DefineConstants>
标记添加到 csproj 的 xml 中来实现该行为。
<PropertyGroup>
。<DefineConstants>SOME_VARIABLE_NAME</DefineConstants>
。#if SOME_VARIABLE_NAME
添加到您的代码以有条件地启用代码。