2

最近我读了很多关于Debug 类的内容。

我个人对此感到很伤心。我可以看到它改进了创建非常棘手的算法的过程。但它也为我的应用程序添加了很多代码,我不得不在不必要的情况下遍历这些代码。拥有调试器应该消除对样板代码的需求,无论它是否被自动剥离以进行发布构建,对吗?

我也对你们中那些真正使用 Debug 类的人是如何做到这一点感兴趣的。您是否编写了 Debug.Assert 语句,或者您同意 Ed Kaim的观点,即您应该使用 Debug.WriteLine 和 Debug.Fail。

4

8 回答 8

3

我个人同意埃德·凯姆的观点。就个人而言,我觉得良好的测试实践已经取代了我所有工作中的 Debug.Assert 调用。此外,我也几乎放弃了对 Debug.Fail 的使用 - 任何时候我想使用它,我几乎发现我想在发布和调试中抛出异常,所以我通常看不到点。

话虽如此,我仍然使用一些调试打印语句来增强我的调试(通过 Debug.WriteLine),尤其是在数字代码中......我承认这是对老式 printf 调试的回归,但通常,那仍然是追踪问题的最快方法,尤其是在调试器中没有出现的问题(由于时间问题、线程等)。

于 2009-07-09T15:51:47.150 回答
2

就个人而言,我很少在任何编程中使用 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 类。这是一个我没有太多经验的领域,所以我渴望学习。

于 2009-07-09T16:04:05.753 回答
1

与简单地在调试器中运行代码相比,使用 Debug 类的主要优点是您可以获得一个日志文件(使用 Debug.Writeline 语句),您可以与同事共享/存储以供记录。

Debug.Assert 相对于编写单独的测试方法的优点是紧凑,并且检查正好在它需要的地方,而不是单独的方法。

于 2009-07-09T16:02:42.213 回答
1

我自己的观点是 Debug.Assert 和 Debug.Fail 经常被误用来向最终用户“隐藏”错误。如果有必要,我宁愿写入错误日志或抛出异常。

于 2009-07-09T16:12:57.327 回答
1

我不能告诉你是否应该这样做,但我可以建议我使用它的时间。

当我想要有关函数/变量/过程/结果的更多信息时,我会使用 Debug,但我知道一旦发布该信息就不再相关。例如,我使用 Debug.Writeline 来验证进程的正确年表,或者使用 Debug.Assert 来验证值是否应该是。

我认为Kaim 只是说很容易误用Debug.Assert。不要使用 Debug.Assert 来捕获生产中可能出现的问题。Debug.Assert 用于开发期间的简单检查,例如提醒标志。它并不意味着处理发布代码错误。您可以每隔一行放置一个 Debug.Assert ,而不必担心它会减慢发布代码的速度。

于 2009-07-09T16:17:04.150 回答
1

我建议根本不要使用该Debug课程;我不。一般来说,我发现调试器足以满足我的所有需求。以及我真正需要跟踪的内容,我会记录下来。关于日志记录最关键的部分是日志记录也发生在生产代码中,这可能是绝对重要的。 Debug根据定义,仅在调试代码中起作用;虽然它可能有助于帮助您在开发过程中找到一些东西,但如果找到它很重要,请将其记录下来。严重地。如果发现它很重要并且足够棘手,以至于您需要特殊的设施才能找到它,请记录它;它可能会作为边缘案例出现在您的生产环境中,那么您将怎么做?

对于它的价值,我发现 log4net 对于日志记录非常有用和强大。我建议在Debug任何一天使用它而不是使用该类。

于 2009-07-09T17:10:52.483 回答
0

我们经常使用 Debug.Assert - 对于每一个重要的假设,你都会做出拥有 Assert 的无害的假设。

相当有用但很老的文章 - IDesign C# Coding Standards here

于 2009-07-09T15:53:33.497 回答
0

Debug.Assert 测试合约。它有一点好处是它不存在于发布代码中。if + throwing 异常情况并非如此。

我将 Debug.WriteLine 用于 UI 事件,因为调试器妨碍了(例如,从 VS 窗口切换到应用程序窗口时再次调用刷新事件)。

于 2009-07-09T15:59:47.900 回答