C#调试:[DebuggerDisplay]还是ToString()?

时间:2010-07-06 23:48:14

标签: c# debugging tostring debuggerdisplay

有两种方法可以增加调试信息的有用性,而不是在调试器中看到{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);
    }
}

有没有理由更喜欢一个到另一个?有什么理由不这两个都做?这纯粹是个人偏好吗?

4 个答案:

答案 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() 可能是您唯一的选择。