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

时间:2010-09-13 19:00:32

标签: c# tostring debuggerdisplay

我正在寻找一个很好的具体示例,显然需要覆盖ToString(),但要使用[DebuggerDisplay(...)]自定义属性在调试器中显示其他内容?

4 个答案:

答案 0 :(得分:7)

例如,假设二叉树的Node对象。

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

答案 1 :(得分:2)

您还可以添加注意,VB.NET中的调试器不会评估ToString()。因此,如果您计划使用多种语言进行开发,请熟悉这个属性。它在MSDN页面上说明:https://msdn.microsoft.com/en-us/library/x810d419.aspx

  

调试器是否评估此隐式ToString()调用取决于“工具/选项/调试”对话框中的用户设置。 Visual Basic不实现此隐式ToString()评估。

我更喜欢在ToString上使用这个属性,因为假设我不需要将ToString()方法用于其他任何东西,我不喜欢让方法无所事事的想法。

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

答案 2 :(得分:1)

假设您有一个现有的应用程序,其中.ToString()应该将对象序列化为字符串。这不是一个好主意,但假设你处于那种情况。然后,您仍然可以使用[DebuggerDisplay(...)]让您的生活更轻松,而无需修改此类(不可否认,但我怀疑并不罕见)类与应用程序的其余部分之间的合同。

答案 3 :(得分:1)

Lazy in .NET4使用它在debug中显示重要属性:

[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工具查看。