【发布时间】:2011-03-11 04:55:57
【问题描述】:
我正在处理的整个软件项目中散布着许多为调试和实用目的而编写的代码。在我编译我的代码之前,我想要一种方法来选择这些代码块是否应该包含在我的编译中(不需要导航代码注释掉的东西)。我该怎么做?
我正在使用 c# 编程并使用 Microsoft Visual Studio 2010。
【问题讨论】:
标签: c# visual-studio debugging shortcuts
我正在处理的整个软件项目中散布着许多为调试和实用目的而编写的代码。在我编译我的代码之前,我想要一种方法来选择这些代码块是否应该包含在我的编译中(不需要导航代码注释掉的东西)。我该怎么做?
我正在使用 c# 编程并使用 Microsoft Visual Studio 2010。
【问题讨论】:
标签: c# visual-studio debugging shortcuts
将属性[Conditional("DEBUG")] 添加到您只想在调试版本中执行的方法上。有关更多详细信息,请参阅here。
【讨论】:
我建议将您的块包含在#ifdef SOMETHING 和#endif 中,然后在您想在编译中包含该块时在您的项目设置中定义SOMETHING。
【讨论】:
您需要预处理器指令或条件编译语句。你可以阅读他们的信息here。
来自该链接的示例:
#define TEST
using System;
public class MyClass
{
public static void Main()
{
#if (TEST)
Console.WriteLine("TEST is defined");
#else
Console.WriteLine("TEST is not defined");
#endif
}
}
只有在代码顶部定义了 TEST 时才会编译代码。许多开发人员使用#define DEBUG,因此他们可以启用调试代码并通过更改顶部的那一行再次将其删除。
【讨论】:
考虑使用the Debug class 有条件地记录、断言等。这样做有很多优点。您可以选择在运行时记录(或不记录)。它们将您限制为(大部分)不改变行为的行为,解决了@STW 的一些(有效)问题。它们允许使用第三方日志记录工具。
【讨论】:
您可以使用preprocessor directives 和#if
【讨论】:
如果它们是为了调试,那么唯一可接受的解决方案是在这些代码周围加上:
#ifdef DEBUG
#endif
这样可以确保在调试模式下编译时包含代码,但在发布模式下排除代码。
【讨论】:
您可能需要考虑将这些调试功能完全从类中移出——让您的类在调试和发布模式之间“改变形状”可能会非常令人头疼,并且可能难以诊断问题。
您可以考虑创建一个单独的“调试”程序集,其中包含所有调试助手——然后确保您可以将其从解决方案中排除并在没有它的情况下成功构建。
【讨论】: