有两种方法可以增加调试信息的有用性,而不是在调试器中看到{MyNamespace.MyProject.MyClass}
。
这些是[DebuggerDisplayAttribute][1]
和ToString()
方法的使用。
using System.Diagnostics;
...
[DebuggerDisplay("Name = {Name}")]
public class Person
{
public string Name;
}
或
public class Person
{
public string Name;
public override string ToString()
{
return string.Format("Name = {0}", Name);
}
}
有没有理由更喜欢一个到另一个?有什么理由不这两个都做?这纯粹是个人偏好吗?
答案 0 :(得分:82)
使用[DebuggerDisplay]
仅适用于调试器。重写ToString()具有在运行时更改显示的“副作用”。
这可能是也可能不是好事。
通常,您希望在调试期间获得比标准ToString()
输出更多的信息,在这种情况下,您可以使用两者。
例如,在您的情况下,“ToString”实现对我来说似乎很奇怪。我希望“Person”类ToString()实现只是直接返回Name,而不是“Name = PersonsName”。但是,在调试过程中,我可能需要额外的信息。
答案 1 :(得分:5)
"当您创建自定义类或结构时,您应该覆盖 ToString方法,以便提供有关您的类型的信息 客户代码。" - MSDN
如果ToString()
返回并且您在调试器中看到的不是您想要的,那么您使用DebuggerDisplayAttribute
。
答案 2 :(得分:2)
还可以考虑调试器的缓慢:
在每个调试步骤/断点之后,调试器将 DebuggerDisplayAttribute
格式表达式解释。
ToString
在您的代码中已编译,因此调试器执行起来要快得多。
条件断点的情况相同:如果每次执行到达断点时调度器都无法解释条件表达式,那么删除断点并添加如下临时代码会很有用: if (condition) Debugger.Break();
答案 3 :(得分:0)
DebuggerDisplay
的功能非常有限。您只有一个格式字符串,可用于显示某些成员的值。
如果您想有条件地显示数据、来自多层深度的数据或聚合数据,ToString()
可能是您唯一的选择。