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

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

#define DEBUG 
#define RELEASE

我测试的变量对吗?

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

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


当前回答

如果您试图使用为构建类型定义的变量,您应该删除这两行…

#define DEBUG  
#define RELEASE 

... 这将导致#if (DEBUG)始终为真。

RELEASE也没有默认的条件编译符号。如果您想定义一个转到项目属性,单击Build选项卡,然后将RELEASE添加到General标题下的Conditional编译符号文本框中。

另一个选择是这样做……

#if DEBUG
    Console.WriteLine("Debug");
#else
    Console.WriteLine("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;
    }
}

我得想个更好的办法。我明白了,#if块是其他配置中的有效注释(假设DEBUG或RELEASE;但任何符号都适用)

public class Mytest
    {
        public DateTime DateAndTimeOfTransaction;
    }

    public void ProcessCommand(Mytest Command)
        {
            CheckMyCommandPreconditions(Command);
            // do more stuff with Command...
        }

        [Conditional("DEBUG")]
        private static void CheckMyCommandPreconditions(Mytest Command)
        {
            if (Command.DateAndTimeOfTransaction > DateTime.Now)
                throw new InvalidOperationException("DateTime expected to be in the past");
        }

如果您试图使用为构建类型定义的变量,您应该删除这两行…

#define DEBUG  
#define RELEASE 

... 这将导致#if (DEBUG)始终为真。

RELEASE也没有默认的条件编译符号。如果您想定义一个转到项目属性,单击Build选项卡,然后将RELEASE添加到General标题下的Conditional编译符号文本框中。

另一个选择是这样做……

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

确保在“项目生成属性”中定义了DEBUG常量。这将启用#if DEBUG。我没有看到预定义的RELEASE常量,所以这可能意味着任何不在DEBUG块中的东西都是RELEASE模式。

一个可以为您节省大量时间的技巧-不要忘记,即使您在构建配置下选择了调试(在vs2012/13菜单中,它在build => configuration MANAGER下)-这是不够的。

你需要注意PUBLISH配置,比如: