我正在寻找一个很好的具体示例,显然希望ToString()
用某些东西覆盖,但要使用[DebuggerDisplay(...)]
自定义属性在调试器中显示其他东西?
4 回答
例如,二叉树的 Node 对象。
ToString()
只想显示该节点的有效负载,而可能DebuggerDisplay
还会显示它指向的节点。
您还可以添加注意,在 VB.NET 中的调试器不会评估 ToString()。因此,如果您打算使用多种语言进行开发,那么最好习惯这种属性。在 MSDN 页面上有说明:https ://msdn.microsoft.com/en-us/library/x810d419.aspx
调试器是否评估此隐式 ToString() 调用取决于“工具/选项/调试”对话框中的用户设置。Visual Basic 不实现此隐式 ToString() 评估。
我更喜欢在 ToString 上使用此属性,因为假设我不需要将 ToString() 方法用于其他任何事情,我不喜欢让一个方法白白地坐在那里的想法。
如果您需要其他原因,我认为使用声明性方法更有意义,因为调试器显示字符串只是一些元数据,它也可以被其他一些工具使用。
假设您有一个现有的应用程序,其中预期 .ToString() 将对象序列化为字符串。并不是说这是一个好主意,但假设您处于这种情况。然后,您仍然可以使用 [DebuggerDisplay(...)] 让您的生活更轻松,而无需修改类和应用程序其余部分之间的这个(诚然不好,但我怀疑并不罕见)合同。
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工具查看它。