2

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

4

4 回答 4

7

例如,二叉树的 Node 对象。

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

于 2010-09-13T19:07:14.400 回答
2

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

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

我更喜欢在 ToString 上使用此属性,因为假设我不需要将 ToString() 方法用于其他任何事情,我不喜欢让一个方法白白地坐在那里的想法。

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

于 2010-09-14T05:40:00.037 回答
1

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

于 2010-09-13T19:03:02.383 回答
1

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

颜色结构

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

于 2010-09-14T05:54:13.680 回答