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

C# [DebuggerDisplay(…)]属性有用的示例?,c#,tostring,debuggerdisplay,C#,Tostring,Debuggerdisplay,我正在寻找一个很好的具体示例,在这个示例中,显然需要使用某种内容覆盖ToString(),但使用[DebuggerDisplay(…)]自定义属性来显示调试器中的其他内容?假设您有一个现有的应用程序,其中.ToString()应该:,将对象序列化为字符串。并不是说这是个好主意,而是假设你处于那种情况。然后,您仍然可以使用[DebuggerDisplay(…)]来简化您的工作,而无需修改该类与应用程序其余部分之间的契约(无可否认,这很糟糕,但我怀疑这并不罕见)。例如,二叉树的节点对象 ToStri

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

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

例如,二叉树的节点对象


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

您还可以添加注意,VB.NET中的调试器不会计算ToString()。因此,如果您计划使用多种语言进行开发,最好习惯这些属性。MSDN页面上说明:

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

我更喜欢在ToString上使用这个属性,因为假设我不需要对任何其他内容使用ToString()方法,我不喜欢让一个方法免费存在的想法

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

使用它来显示调试中的重要属性:

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

或:


您可以使用工具查看它。

XElement.ToString()也是类似的情况。尽管在调试器中查看XML可能是您想要的。我想OP是在问为什么在ToString方法中有不同的东西是有用的。这实际上是不正确的。如果不存在
[DebuggerDisplay(…)]
属性。MSDN页面上说明,调试器会评估截至VS 2015的
ToString()
@Timwi:。没有关于VS 2017的信息。我在答复中已经澄清了这一点。
    [Serializable, ComVisible(true), DebuggerTypeProxy(typeof(ArrayListDebugView)), 
DebuggerDisplay("Count = {Count}")]
    public class ArrayList : IList, ICollection, IEnumerable, ICloneable
    {
    ...
    }
    [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
    {
    ...
    }