在解决方案属性中,我已经将我唯一的项目的配置设置为“发布”。

在主例程的开头,我有这样的代码,它显示“Mode=Debug”。 我在最上面还有这两行:

#define DEBUG 
#define RELEASE

我测试的变量对吗?

#if (DEBUG)
            Console.WriteLine("Mode=Debug"); 
#elif (RELEASE)
            Console.WriteLine("Mode=Release"); 
#endif

我的目标是根据调试和发布模式为变量设置不同的默认值。


当前回答

我不是#if之类的东西的超级粉丝,特别是如果你把它散布在你的代码库中,因为如果你不小心,它会给你带来调试构建通过但发布构建失败的问题。

下面是我想出的(灵感来自c#中的#ifdef):

public interface IDebuggingService
{
    bool RunningInDebugMode();
}

public class DebuggingService : IDebuggingService
{
    private bool debugging;

    public bool RunningInDebugMode()
    {
        //#if DEBUG
        //return true;
        //#else
        //return false;
        //#endif
        WellAreWe();
        return debugging;
    }

    [Conditional("DEBUG")]
    private void WellAreWe()
    {
        debugging = true;
    }
}

其他回答

默认情况下,如果项目在调试模式下编译,Visual Studio定义DEBUG,如果项目在发布模式下编译,则不定义DEBUG。默认情况下,RELEASE模式中没有定义RELEASE。可以这样说:

#if DEBUG
  // debug stuff goes here
#else
  // release stuff goes here
#endif

如果你只想在发布模式下做某事:

#if !DEBUG
  // release...
#endif

此外,值得指出的是,您可以在返回void的方法上使用[Conditional("DEBUG")]属性,以便仅在定义了某个符号时执行它们。如果符号没有定义,编译器将删除对这些方法的所有调用:

[Conditional("DEBUG")]
void PrintLog() {
    Console.WriteLine("Debug info");
}

void Test() {
    PrintLog();
}

DEBUG/_DEBUG应该已经在VS中定义了。

在代码中删除#define DEBUG。在构建配置中为特定的构建设置预处理器。

它打印“Mode=Debug”的原因是因为你的#define,然后跳过elif。

正确的检查方法是:

#if DEBUG
    Console.WriteLine("Mode=Debug"); 
#else
    Console.WriteLine("Mode=Release"); 
#endif

不要检查RELEASE。

我不是#if之类的东西的超级粉丝,特别是如果你把它散布在你的代码库中,因为如果你不小心,它会给你带来调试构建通过但发布构建失败的问题。

下面是我想出的(灵感来自c#中的#ifdef):

public interface IDebuggingService
{
    bool RunningInDebugMode();
}

public class DebuggingService : IDebuggingService
{
    private bool debugging;

    public bool RunningInDebugMode()
    {
        //#if DEBUG
        //return true;
        //#else
        //return false;
        //#endif
        WellAreWe();
        return debugging;
    }

    [Conditional("DEBUG")]
    private void WellAreWe()
    {
        debugging = true;
    }
}

对Tod Thomson的答案稍加修改(私生子化?),将其作为一个静态函数而不是一个单独的类(我希望能够从我已经包含的viewutils类中调用它)。

public static bool isDebugging() {
    bool debugging = false;

    WellAreWe(ref debugging);

    return debugging;
}

[Conditional("DEBUG")]
private static void WellAreWe(ref bool debugging)
{
    debugging = true;
}
bool isDebug = false;
Debug.Assert(isDebug = true); // '=', not '=='

方法Debug。Assert具有条件属性DEBUG。如果没有定义,则取消调用和isDebug = true赋值:

如果定义了符号,则包含调用;否则,调用(包括调用参数的计算)将被省略。

如果定义了DEBUG,则isDebug将被设置为true(并传递给DEBUG)。Assert,在这种情况下它什么也不做)。