在大型项目中,使用哪种方法更好,以及为什么:
#if DEBUG
public void SetPrivateValue(int value)
{ ... }
#endif
or
[System.Diagnostics.Conditional("DEBUG")]
public void SetPrivateValue(int value)
{ ... }
在大型项目中,使用哪种方法更好,以及为什么:
#if DEBUG
public void SetPrivateValue(int value)
{ ... }
#endif
or
[System.Diagnostics.Conditional("DEBUG")]
public void SetPrivateValue(int value)
{ ... }
当前回答
对于第一个示例,如果没有定义DEBUG,则SetPrivateValue将不存在于构建中;对于第二个示例,如果没有定义DEBUG,则对SetPrivateValue的调用将不存在于构建中。
对于第一个示例,您还必须使用#if DEBUG包装任何对SetPrivateValue的调用。
对于第二个示例,将省略对SetPrivateValue的调用,但请注意,SetPrivateValue本身仍将被编译。如果您正在构建一个库,那么引用您的库的应用程序仍然可以使用您的函数(如果条件满足),那么这很有用。
如果你想忽略调用并节省被调用者的空间,你可以结合使用这两种技术:
[System.Diagnostics.Conditional("DEBUG")]
public void SetPrivateValue(int value){
#if DEBUG
// method body here
#endif
}
其他回答
对于第一个示例,如果没有定义DEBUG,则SetPrivateValue将不存在于构建中;对于第二个示例,如果没有定义DEBUG,则对SetPrivateValue的调用将不存在于构建中。
对于第一个示例,您还必须使用#if DEBUG包装任何对SetPrivateValue的调用。
对于第二个示例,将省略对SetPrivateValue的调用,但请注意,SetPrivateValue本身仍将被编译。如果您正在构建一个库,那么引用您的库的应用程序仍然可以使用您的函数(如果条件满足),那么这很有用。
如果你想忽略调用并节省被调用者的空间,你可以结合使用这两种技术:
[System.Diagnostics.Conditional("DEBUG")]
public void SetPrivateValue(int value){
#if DEBUG
// method body here
#endif
}
通常你会在Program.cs中需要它,在这里你想要决定在非调试代码上运行调试,而在Windows服务中也是如此。因此,我创建了一个只读字段IsDebugMode,并在静态构造函数中设置其值,如下所示。
static class Program
{
#region Private variable
static readonly bool IsDebugMode = false;
#endregion Private variable
#region Constrcutors
static Program()
{
#if DEBUG
IsDebugMode = true;
#endif
}
#endregion
#region Main
/// <summary>
/// The main entry point for the application.
/// </summary>
static void Main(string[] args)
{
if (IsDebugMode)
{
MyService myService = new MyService(args);
myService.OnDebug();
}
else
{
ServiceBase[] services = new ServiceBase[] { new MyService (args) };
services.Run(args);
}
}
#endregion Main
}
这个也很有用:
if (Debugger.IsAttached)
{
...
}
我相信很多人会不同意我的观点,但作为一个构建人员,我经常听到“但它在我的机器上工作!”,我的立场是,你几乎不应该使用它们。如果您确实需要一些东西来测试和调试,请找出一种方法,使可测试性与实际的生产代码分开。
在单元测试中抽象带有模拟的场景,为您想要测试的一次性场景制作一次性内容的版本,但不要将用于调试的测试放入用于测试和为生产版本编写的二进制代码中。这些调试测试只是向开发人员隐藏了可能的错误,所以直到过程的后期才会发现它们。
让我们假设您的代码也有一个#else语句,它定义了一个空存根函数,处理Jon Skeet的一个点。这两者之间还有第二个重要的区别。
假设#if DEBUG或Conditional函数存在于被你的主项目可执行文件引用的DLL中。使用#if,将根据库的编译设置执行条件的求值。使用Conditional属性,条件的计算将根据调用程序的编译设置执行。