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


92

有两种方法可以提高调试信息的有效性,而不是{MyNamespace.MyProject.MyClass}在调试器中查看。

这些是DebuggerDisplayAttributeToString()方法的使用。

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);
    }
}

有什么理由更喜欢另一种吗?有什么理由不做这两件事?纯粹是个人喜好吗?

Answers:


94

使用[DebuggerDisplay]仅适用于调试器。重写ToString()具有在运行时更改显示的“副作用”。

这可能不是好事。

通常,您在调试过程中需要比标准ToString()输出更多的信息,在这种情况下,您会同时使用两者。

例如,在您的情况下,“ ToString”实现对我来说似乎很奇怪。我希望“ Person”类的ToString()实现仅直接返回Name,而不是“ Name = PersonsName”。但是,在调试过程中,我可能需要这些额外的信息。


9
+1附加到Reed的“副作用”要点:ToString通常用作“默认显示字符串”,例如,通过Console.WriteLine或WPF数据绑定。
斯蒂芬·克莱里

当然; 该字符串的格式仅是一个可视示例,以强调其与为DebuggerDisplay给出的字符串的相似性。如您所说,DebuggerDisplay格式也可以直接返回名称。不过,我看到了您关于副作用的观点-这是我要寻找的一种区别。我通常不会在类上使用ToString方法(除了上面给出的目的),因此它的其他用法对我来说并不那么明显。谢谢!
bwerks 2010年

5

“创建自定义类或结构时,应重写ToString方法,以便将有关类型的信息提供给客户端代码。” — MSDN

如果ToString()返回的结果与您在调试器中看到的不是您想要的一样,请使用DebuggerDisplayAttribute


4

还可以考虑调试器的速度:

DebuggerDisplayAttribute调试器在每个调试步骤/断点之后解释格式表达式。

ToString是在您的代码中编译的,因此调试器执行起来要快得多。

条件断点也是如此:如果条件表达式太慢而无法在每次执行到达断点时由调试器解释,则删除断点并添加如下所示的临时代码可能很有用: if (condition) Debugger.Break();

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.