C# 何时使用DebuggerDisplayAttribute

C# 何时使用DebuggerDisplayAttribute,c#,.net,visual-studio,debugging,debuggerdisplay,C#,.net,Visual Studio,Debugging,Debuggerdisplay,世界各地有哪些最佳实践?什么指导您决定何时以及如何将属性应用于代码?例如 您是否发现DebuggerDisplayAttribute对某些类型的对象(即自定义数据结构)比其他对象更有用 您是在公共类型、内部类型还是两者上定义它 您通常会将它添加到初始实现中,还是等待测试人员/用户请求它 什么时候定义DebuggerDisplayAttribute更好,什么时候重写.ToString()更有意义 您是否有关于在属性中公开多少数据的指导原则,或者对要包含的计算量有限制 是否有任何继承规则适用于基类,

世界各地有哪些最佳实践?什么指导您决定何时以及如何将属性应用于代码?例如

  • 您是否发现
    DebuggerDisplayAttribute
    对某些类型的对象(即自定义数据结构)比其他对象更有用
  • 您是在公共类型、内部类型还是两者上定义它
  • 您通常会将它添加到初始实现中,还是等待测试人员/用户请求它
  • 什么时候定义
    DebuggerDisplayAttribute
    更好,什么时候重写
    .ToString()
    更有意义
  • 您是否有关于在属性中公开多少数据的指导原则,或者对要包含的计算量有限制
  • 是否有任何继承规则适用于基类,使其更适合于基类
  • 当决定何时或如何使用它时,还有什么要考虑的吗?
    当我知道代码部分需要大量调试时,我经常使用它。在调试器中浏览对象时,它可以节省一些时间,尤其是在使用诸如
    “{ChildCollection.Count}”
    之类的表达式时。它可以让您快速了解正在查看的数据

    我几乎总是把它放在最终会出现在集合中的类上,这样就可以很快地看到每个项,而不仅仅是一堆需要扩展的MyNamespace.MyClass元素


    我的观点是,
    ToString()
    用于提供数据的最终用户表示。DebuggerDisplay面向开发人员,您可以决定显示元素ID、一些附加的内部/私有属性。

    这是主观的,我不想说有什么最佳实践,但是:

  • 您是否发现DebuggerDisplayAttribute对某些类型的对象(即自定义数据结构)比其他对象更有用
  • 到目前为止,最常见的用法是表示业务实体的类型——我通常会显示ID+name。还包括将存储在应用程序集合中的任何类型

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

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

    两者都有

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

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

    4.何时定义DebuggerDisplayAttribute更好,何时重写.ToString()更有意义

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

    5.您是否有关于在属性中公开多少数据的指导原则,或者对要包含的计算量有限制

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

    您不必像在运行时日志记录中那样担心敏感数据的公开(例如,通过重写.ToString),因为这些数据在调试器中无论如何都是可见的

    6.是否有任何继承规则适用于基类,使其更适合于基类

    不,在你需要的课程上应用它

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


    我想不出其他任何东西。

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


    一般来说,链接到最佳实践看起来像是合理的建议;然而,我个人不赞成使用专用的
    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
    属性的调试模式

    [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
    }
    



    虽然该属性很旧,但您应该观看掌声和讲述者的反应:)顺便说一句,如果您想看到更多调试器技巧,您应该在空闲时间观看完整的演示。

    这是自动的。你调试和咕哝调试信息,直到你厌倦了它,并写了一个。谢谢你的全面回答。Re:#3,我特别想到了其他人将通过调试器运行的公共API。在这些情况下,您是否避免显示对消费者不太有用的内部数据?@Scott-老实说,最大的成功是当您在调试器中有一组对象,并且希望快速找到感兴趣的对象时。在这种情况下,表示某种Id和名称的属性是最有用的——一旦开发人员确定了感兴趣的元素,他就可以打开它查看内部数据。尽管如此,我不会显式隐藏内部数据,因为调试器中没有真正私有的数据。