【问题标题】:When to use DebuggerDisplayAttribute何时使用 DebuggerDisplayAttribute
【发布时间】:2011-07-31 08:56:24
【问题描述】:

围绕DebuggerDisplayAttribute 有哪些最佳实践?是什么指导您决定何时以及如何将属性应用于您的代码?比如……

  1. 您是否发现 DebuggerDisplayAttribute 对于某些类型的对象(即自定义数据结构)比其他对象更有用?
  2. 您是在公共类型、内部类型还是两者上定义它?
  3. 您通常会将其添加到初始实现中,还是等待测试人员/用户提出请求?
  4. 什么时候定义DebuggerDisplayAttribute 更好,什么时候覆盖.ToString() 更有意义?
  5. 您是否对在属性中公开多少数据或要包含的计算量有限制?
  6. 是否有任何继承规则适用于基类?
  7. 在决定何时或如何使用它时,还有什么需要考虑的吗?

【问题讨论】:

  • 这是自动的。你在调试信息上调试和喃喃自语,直到你厌倦它并写一个。

标签: c# .net visual-studio debugging debuggerdisplay


【解决方案1】:

这是主观的,我不敢说有任何最佳做法,但是:

  1. 您是否发现 DebuggerDisplayAttribute 在某些类型的对象(即自定义数据结构)上比其他对象更有用?

到目前为止,最常见的用途是表示业务实体的类型 - 我通常会显示 ID + 名称。还有任何将存储在应用程序集合中的类型。

除此之外,每当我发现自己经常在调试器中搜索属性时,我都会添加它。

2.您是在公共类型、内部类型还是两者上定义它?

两者都有。

3.您通常会将其添加到初始实现中,还是等待测试人员/用户请求它?

测试人员/用户永远不会看到它 - 它仅在调试时使用。

4. 什么时候定义 DebuggerDisplayAttribute 更好,什么时候重写 .ToString() 更有意义?

当您需要运行时的表示时,覆盖 ToString(),无论是用于日志记录还是特定于应用程序的目的。如果只需要调试,请使用 DebuggerDisplayAttribute。

5.对于在属性中公开多少数据,或对包含的计算量有限制,您是否有指导方针?

由于它不在运行时使用,唯一的限制是它应该足够快而不会妨碍调试体验(尤其是在为集合元素多次调用时)。

您无需像使用运行时日志记录那样担心暴露敏感数据(例如,通过覆盖 .ToString),因为这些数据在调试器中无论如何都是可见的。

6.是否有任何继承规则适用于基类?

不,把它应用到你需要的类上。

7.在决定何时或如何使用它时,还有什么需要考虑的吗?

我想不出别的了。

【讨论】:

  • 感谢您的详尽回答。回复:#3,我特别想到了其他人将通过调试器运行的公共 API。在这些情况下,您是否会避免显示对消费者不太有用的内部数据?
  • @Scott - 老实说,最大的胜利是当您在调试器中有一组对象并且您想快速找到有趣的对象时。在这种情况下,代表某种 Id 和 Name 的属性是最有用的——一旦开发人员确定了有趣的元素,他就可以打开它来查看内部数据。尽管如此,我不会明确隐藏内部数据,因为在调试器中没有什么是真正私有的。
【解决方案2】:

不带DebuggerDisplay属性的调试模式

带有DebuggerDisplay属性的调试模式

[DebuggerDisplay("{Name,nq}")]//nq suffix means no quotes 
public class Product {

    public int Id { get; set; }

    public string Name { get; set; }

    //Other members of Northwind.Product
}

DebuggerDisplay attribute best practices

Tell the debugger what to show using the DebuggerDisplay Attribute (C#, Visual Basic, F#, C++/CLI)

Debugger/Diagnostics Tips & Tricks in Visual Studio 2019

虽然属性比较老了,但还是要看看掌声和解说员的反应:)顺便说一句,如果你想看更多的调试器技巧,你可能想在空闲时间完全看这个演示。

【讨论】:

    【解决方案3】:

    当我知道代码部分需要大量调试时,我经常使用它。在调试器中浏览对象时,它可以节省一些时间,尤其是当您使用像 "{ChildCollection.Count}" 这样的表达式时。它可以让您快速了解正在查看的数据。

    我几乎总是把它放在最终会出现在集合中的类上,这样可以非常快速地查看每个项目,而不仅仅是一堆必须展开的 MyNamespace.MyClass 元素。

    我的观点是ToString() 用于提供数据的最终用户表示。 DebuggerDisplay 是为开发者准备的,你可以决定显示元素 ID,一些额外的内部/私有属性。

    【讨论】:

      【解决方案4】:

      DebuggerDisplay 对于没有有意义的.ToString() 实现的任何类都具有价值,但我个人还没有看到有人在需要它们之前主动编写属性。

      一般来说,Omer's 指向最佳实践的链接看起来像是中肯的建议;但是,我个人会放弃使用专用 DebuggerDisplay() 方法的建议——即使它是私有的,除了删除魔术字符串之外,它似乎对属性没有什么好处。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-06-20
        • 1970-01-01
        • 2014-02-09
        • 1970-01-01
        相关资源
        最近更新 更多