代码之家  ›  专栏  ›  技术社区  ›  Timwi

[DebuggerDisplay(…)]属性有用的示例?

  •  2
  • Timwi  · 技术社区  · 15 年前

    ToString() 但用一个 [DebuggerDisplay(...)] 自定义属性以在调试器中显示其他内容?

    4 回复  |  直到 15 年前
        1
  •  7
  •   James Curran    15 年前

    ToString() 只想显示该节点的有效负载,而 DebuggerDisplay 可能还会显示它所指向的节点。

        2
  •  2
  •   Johann Blais    8 年前

    您还可以添加注意,ToString()不是由中的调试器计算的VB.NET版. 因此,如果您计划使用多种语言进行开发,那么最好习惯这些属性。MSDN页面上说明: https://msdn.microsoft.com/en-us/library/x810d419.aspx

    我更喜欢在ToString上使用这个属性,因为假设我不需要对其他任何东西使用ToString()方法,我不喜欢让一个方法白放在那里的想法。

    如果您需要其他原因,我认为使用声明性方法更有意义,因为调试器显示字符串只是一些元数据,它也可以被其他工具使用。

        3
  •  1
  •   Roman Starkov    15 年前

    假设您有一个现有的应用程序,其中.ToString()应该将对象序列化为字符串。不是说这是个好主意,但假设你是在那种情况下。然后您仍然可以使用[DebuggerDisplay(…)]来简化您的工作,而不必修改类和应用程序其余部分之间的契约(无可否认是不好的,但我认为这并不罕见)。

        4
  •  1
  •   SeeSharp    15 年前

    Lazy in .NET4 用于显示调试中的重要属性:

    [Serializable, 
    DebuggerDisplay("ThreadSafetyMode={Mode}, IsValueCreated={IsValueCreated}, IsValueFaulted={IsValueFaulted}, Value={ValueForDebugDisplay}"), 
    DebuggerTypeProxy(typeof(System_LazyDebugView<>)), ComVisible(false), HostProtection(SecurityAction.LinkDemand, Synchronization=true, ExternalThreading=true)]
    public class Lazy<T>
    {
    ...
    }
    

    ArrayList 同时使用:

        [Serializable, ComVisible(true), DebuggerTypeProxy(typeof(ArrayListDebugView)), 
    DebuggerDisplay("Count = {Count}")]
        public class ArrayList : IList, ICollection, IEnumerable, ICloneable
        {
        ...
        }
    

    Color structure :

        [Serializable, StructLayout(LayoutKind.Sequential), TypeConverter(typeof(ColorConverter)), 
    DebuggerDisplay("{NameAndARGBValue}"), 
    Editor("System.Drawing.Design.ColorEditor, System.Drawing.Design, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", typeof(UITypeEditor))]
        public struct Color
        {
        ...
        }
    

    你可以通过使用 .NET Reflector 工具。