最近我读了很多关于Debug 类的内容。
我个人对此感到很伤心。我可以看到它改进了创建非常棘手的算法的过程。但它也为我的应用程序添加了很多代码,我不得不在不必要的情况下遍历这些代码。拥有调试器应该消除对样板代码的需求,无论它是否被自动剥离以进行发布构建,对吗?
我也对你们中那些真正使用 Debug 类的人是如何做到这一点感兴趣的。您是否编写了 Debug.Assert 语句,或者您同意 Ed Kaim的观点,即您应该使用 Debug.WriteLine 和 Debug.Fail。
最近我读了很多关于Debug 类的内容。
我个人对此感到很伤心。我可以看到它改进了创建非常棘手的算法的过程。但它也为我的应用程序添加了很多代码,我不得不在不必要的情况下遍历这些代码。拥有调试器应该消除对样板代码的需求,无论它是否被自动剥离以进行发布构建,对吗?
我也对你们中那些真正使用 Debug 类的人是如何做到这一点感兴趣的。您是否编写了 Debug.Assert 语句,或者您同意 Ed Kaim的观点,即您应该使用 Debug.WriteLine 和 Debug.Fail。
我个人同意埃德·凯姆的观点。就个人而言,我觉得良好的测试实践已经取代了我所有工作中的 Debug.Assert 调用。此外,我也几乎放弃了对 Debug.Fail 的使用 - 任何时候我想使用它,我几乎发现我想在发布和调试中抛出异常,所以我通常看不到点。
话虽如此,我仍然使用一些调试打印语句来增强我的调试(通过 Debug.WriteLine),尤其是在数字代码中......我承认这是对老式 printf 调试的回归,但通常,那仍然是追踪问题的最快方法,尤其是在调试器中没有出现的问题(由于时间问题、线程等)。
就个人而言,我很少在任何编程中使用 Debug 类。我已经阅读了很多评论和建议,例如 John Robbins(调试 .NET 2.0 应用程序和Bugslayer专栏的作者)关于为什么应该主动断言的评论和建议——尤其是方法的参数。
我遇到的问题是 - 假设我要编写这样的代码:
Public Sub Test(source As Object)
Debug.Assert(source IsNot Nothing, "source is Nothing")
' Do something....
End Sub
这在调试版本的开发过程中效果很好,但我最终还是这样做了:
Public Sub Test(source As Object)
If source IsNot Nothing Then
' Do something....
End If
End Sub
如果“来源”有可能一无所有,那么无论如何我都会对其进行“如果”检查。我不会在发布版本中留下断言调用。
我不使用 Debug 类的另一个原因是我编写了很多单元测试。这样做导致我覆盖了很多代码路径,因此不需要在我的代码中使用 Debug.Assert。
至于调试日志,那么我只需使用 Trace 调用和 SysInternals DebugView 或文本文件来记录跟踪调用的输出。
我很想听听其他人关于这个主题的意见,因为我也有兴趣了解他们在开发过程中如何使用 Debug 类。这是一个我没有太多经验的领域,所以我渴望学习。
与简单地在调试器中运行代码相比,使用 Debug 类的主要优点是您可以获得一个日志文件(使用 Debug.Writeline 语句),您可以与同事共享/存储以供记录。
Debug.Assert 相对于编写单独的测试方法的优点是紧凑,并且检查正好在它需要的地方,而不是单独的方法。
我自己的观点是 Debug.Assert 和 Debug.Fail 经常被误用来向最终用户“隐藏”错误。如果有必要,我宁愿写入错误日志或抛出异常。
我不能告诉你是否应该这样做,但我可以建议我使用它的时间。
当我想要有关函数/变量/过程/结果的更多信息时,我会使用 Debug,但我知道一旦发布该信息就不再相关。例如,我使用 Debug.Writeline 来验证进程的正确年表,或者使用 Debug.Assert 来验证值是否应该是。
我认为Kaim 只是说很容易误用Debug.Assert。不要使用 Debug.Assert 来捕获生产中可能出现的问题。Debug.Assert 用于开发期间的简单检查,例如提醒标志。它并不意味着处理发布代码错误。您可以每隔一行放置一个 Debug.Assert ,而不必担心它会减慢发布代码的速度。
我建议根本不要使用该Debug
课程;我不。一般来说,我发现调试器足以满足我的所有需求。以及我真正需要跟踪的内容,我会记录下来。关于日志记录最关键的部分是日志记录也发生在生产代码中,这可能是绝对重要的。 Debug
根据定义,仅在调试代码中起作用;虽然它可能有助于帮助您在开发过程中找到一些东西,但如果找到它很重要,请将其记录下来。严重地。如果发现它很重要并且足够棘手,以至于您需要特殊的设施才能找到它,请记录它;它可能会作为边缘案例出现在您的生产环境中,那么您将怎么做?
对于它的价值,我发现 log4net 对于日志记录非常有用和强大。我建议在Debug
任何一天使用它而不是使用该类。
我们经常使用 Debug.Assert - 对于每一个重要的假设,你都会做出拥有 Assert 的无害的假设。
相当有用但很老的文章 - IDesign C# Coding Standards here
Debug.Assert 测试合约。它有一点好处是它不存在于发布代码中。if + throwing 异常情况并非如此。
我将 Debug.WriteLine 用于 UI 事件,因为调试器妨碍了(例如,从 VS 窗口切换到应用程序窗口时再次调用刷新事件)。