我正在寻找一个很好的具体示例,显然需要覆盖ToString()
,但要使用[DebuggerDisplay(...)]
自定义属性在调试器中显示其他内容?
答案 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
{
...
}
[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工具查看。