如何使Debug和Release的编译结果不同?

15

我是C#的新手,在编译一个C#项目时遇到了问题。涉及到在Debug和Release模式下进行调试日志记录的问题。 我想要在Debug模式下调用该日志功能,但在Release模式下不调用,考虑到性能问题。 我知道在C/C++中这很容易实现:

// this is C/C++ sample, not C#
#ifdef DEBUG
#define DebugLog(CString,__VA_ARGS__) LogFunction(CString,__VA_ARGS__)
#else
#define DebugLog
#endif

在上述的C/C++代码中,DebugLog()是在Debug模式下编译和调用的,但在Release模式下不编译或调用,因此可以确保性能。

在C#中是否有类似于上述C/C++代码的方法?


也许你可以看一下这个链接:http://msdn.microsoft.com/zh-cn/library/system.diagnostics.debug.aspx - Etienne de Martel
5个回答

19
在C#中,您可以这样做。
#if DEBUG
                //debug-mode only snippet go here.
#endif

这是 #if 指令的参考文档。


16

等效的方法是在方法上使用 [Conditional] 属性。像这样:

[Conditional("DEBUG")]
public static void DebugLog(string fmt, params object[] args) {
    // etc..
}
在 Release 构建中(DEBUG 未定义),编译器将删除该方法以及对该方法的调用。在重新发明此轮子之前,请确保查看 .NET 框架中的 Debug 和 Trace 类,它们已经实现了这一点,并且具有重定向调试/跟踪信息的灵活性。

感谢大家的回答。我认为这就是我想要的——即使没有在调试模式下编译。 - McArthor Lee
只有当方法的返回类型为void时,这才有效。所以你不能像那样修饰MVC Action。我最后使用了#if DEBUG - FirstVertex

4
您可以在C#中完成同样的事情。在项目属性中,您可以设置一个条件编译符号,例如DEBUG。实际上,我认为当您创建一个项目时,Visual Studio会默认执行此操作 - 它将在调试模式下添加DEBUG标志,并在切换到发布模式时删除该标志。这可以在项目属性->构建选项卡中进行配置。您还可以添加自己的标志以用于特定于平台的代码。 Pocket_PC标志是一个著名的标志,用于在.NET Compact Framework上进行老式Windows Mobile开发。
有了这个,您可以像这样添加预处理器指令:
#if DEBUG

//  debug code here

#endif

1

其他方法,可以包括像“条件”属性这样的内容

[Conditional("DEBUG")]
void DebugLog()
{
   // method code here
}

更多信息可以在MSDN 这里 找到


感谢大家的回答。我想这就是我想要的——不是在调试模式下编译。 - McArthor Lee

0
/// <summary>Function to Set Debug Flag to true if DEBUG is in Effect</summary>
/// <param name="theDebugFlag">output - true if DEBUG, unchanged if RELEASE</param>
[Conditional("DEBUG")]
static void QueryDebugStatus(ref Boolean theDebugFlag)
{
theDebugFlag = true;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接