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