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

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

#define DEBUG 
#define RELEASE

我测试的变量对吗?

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

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


当前回答

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

其他回答

It is worth noting here that one of the most significant differences between conditionally executing code based on #if DEBUG versus if(System.Diagnostics.Debugger.IsAttached) is that the compiler directive changes the code that is compiled. That is, if you have two different statements in an #if DEBUG/#else/#endif conditional block, only one of them will appear in the compiled code. This is an important distinction because it allows you do do things such as conditionally compile method definitions to be public void mymethod() versus internal void mymethod() depending on build type so that you can, for example, run unit tests on debug builds that will not break access control on production builds, or conditionally compile helper functions in debug builds that will not appear in the final code if they would violate security in some way should they escape into the wild. The IsAttached property, on the other hand, does not affect the compiled code. Both sets of code are in all of the builds - the IsAttached condition will only affect what is executed. This by itself can present a security issue.

Since the purpose of these COMPILER directives are to tell the compiler NOT to include code, debug code,beta code, or perhaps code that is needed by all of your end users, except say those the advertising department, i.e. #Define AdDept you want to be able include or remove them based on your needs. Without having to change your source code if for example a non AdDept merges into the AdDept. Then all that needs to be done is to include the #AdDept directive in the compiler options properties page of an existing version of the program and do a compile and wa la! the merged program's code springs alive!.

对于还没有准备好进入黄金时段的新流程,或者在发布之前不能在代码中活动的新流程,您可能还想使用声明式。

总之,我就是这么做的。

删除顶部的定义

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

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

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

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

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

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

正确的检查方法是:

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

不要检查RELEASE。