在我看到的所有关于#if编译器指令的例子中,它们都使用了“DEBUG”。我可以以同样的方式使用“RELEASE”来排除在调试模式下编译时不想运行的代码吗?我想用这个块包围的代码会发送一堆电子邮件,我不想在测试时意外地发送这些邮件。
不,不会的,除非你做点工作。
这里重要的部分是DEBUG到底是什么,它是编译器可以检查的一种定义的常量。
如果你检查项目属性,在Build选项卡下,你会发现三个东西:
标记为“条件编译符号”的文本框 标记为“定义调试常量”的复选框 标记为“定义TRACE常量”的复选框
没有这样的复选框,也没有预先定义的名为RELEASE的常量/符号。
但是,您可以轻松地将该名称添加到标记为“条件编译符号”的文本框中,但请确保在这样做之前将项目配置设置为发布模式,因为这些设置是每个配置的。
所以基本上,除非您将其添加到文本框中,否则#if RELEASE在任何配置下都不会生成任何代码。
在我的VS install (VS 2008) #if RELEASE不工作。但是你可以使用#if !DEBUG
例子:
#if !DEBUG
SendTediousEmail()
#endif
不。
在调试配置中有一个debug定义的常量(由Visual Studio自动定义),而在发布模式中没有定义这样的常量。检查构建中的项目设置。
在Project -> Build下选择[Define DEBUG常量]就像在每个文件的开头都包含# Define DEBUG。
如果你想为发布配置定义一个RELEASE常量,请到:
项目属性->构建 选择释放模式 在“条件编译符号”文本框中输入:RELEASE
“流行卡特林”说对了。基于构建类型控制定义提供了很大的灵活性。例如,您可以在同一个解决方案中拥有“DEBUG”、“DEMO”和“RELEASE”配置。这避免了使用两个不同的解决方案进行重复编程的需要。
因此,当定义RELEASE条件编译符号时,#if RELEASE或#if (RELEASE)的工作原理与#if DEBUG相同。
以下是来自“Pop Catalin”的帖子: 如果你想为发布配置定义一个RELEASE常量,请到: *项目属性->构建 *选择释放模式 *在条件编译符号文本框中输入:RELEASE
我知道这是一个老问题,但值得一提的是,您可以在DEBUG和RELEASE之外创建自己的配置,例如TEST或UAT。
如果在项目属性页的Build选项卡上,你将“条件编译符号”设置为TEST(例如),你就可以使用这样的构造
#if (DEBUG || TEST )
//Code that will not be executed in RELEASE or UAT
#endif
您可以出于特定的原因使用此构造,例如,如果需要,可以使用不同的客户端,甚至可以使用整个Web方法。我们过去也使用过这种方法,因为某些命令在特定的硬件上导致了问题,所以当部署到硬件X时,我们有一个应用程序的配置。
您可以创建自己的条件编译时符号(任何您喜欢的名称)。 进入“项目构建对话框”,位于项目属性框中, 菜单选项:Project->[projectname]属性…
你也可以在c#代码文件的顶部定义它们。如:
#define RELEASE
// or
#undef RELEASE
你可以在#if语句中使用该符号:
#if RELEASE
// code ...
#elif …
// code ...
#endif
// or
#if !RELEASE
// code ...
#endif
虽然M4N的答案(#if (!DEBUG))最有意义,但另一种选择可能是使用预处理器来修改其他标志的值;如。
bool isRelease = true;
#if DEBUG
isRelease = false;
#endif
或者更好的方法是,使用定义预期行为的标志,并根据模式设置它们,而不是引用我们是在发布模式还是调试模式:
bool sendEmails = true;
#if DEBUG
sendEmails = false;
#endif
这与使用预处理器标志是不同的,因为这些标志在生产中仍然存在,所以每次调用该代码时,您都会产生if (sendEmails) {/* send邮件*/}的开销,而不是在发布版中存在但在调试中不存在的代码,但这可能是有利的;例如,在你的测试中,你可能想要调用你的SendEmails()方法,但在模拟上,同时在调试中运行以获得额外的输出。
推荐文章
- 如何创建数组。包含不区分大小写的字符串数组?
- 检查字符串是否包含字符串列表中的元素
- 最好的方法在asp.net强制https为整个网站?
- 将字符串转换为System.IO.Stream
- Eclipse调试器总是阻塞在ThreadPoolExecutor上,没有任何明显的异常,为什么?
- 如何从枚举中选择一个随机值?
- 驻留在App_Code中的类不可访问
- 在链式LINQ扩展方法调用中等价于'let'关键字的代码
- dynamic (c# 4)和var之间的区别是什么?
- Visual Studio: ContextSwitchDeadlock
- Visual Studio:如何打破处理异常?
- 返回文件在ASP。Net Core Web API
- 自定义HttpClient请求头
- 确保您的项目构建设置正在生成一个dSYM文件。对于所有配置,DEBUG_INFORMATION_FORMAT都应该设置为dwarf-with-dsym
- 如果我使用OWIN Startup.cs类并将所有配置移动到那里,我是否需要一个Global.asax.cs文件?