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

bwe*_*rks 79 c# debugging tostring debuggerdisplay

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

这些是使用[DebuggerDisplayAttribute][1]ToString()方法.

using System.Diagnostics;
...

[DebuggerDisplay("Name = {Name}")]
public class Person
{
    public string Name;
}
Run Code Online (Sandbox Code Playgroud)

要么

public class Person
{
    public string Name;
    public override string ToString()
    {
        return string.Format("Name = {0}", Name);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Ree*_*sey 85

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

这可能是也可能不是好事.

通常,您希望在调试期间获得比标准ToString()输出更多的信息,在这种情况下,您可以使用两者.

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

  • +1要添加到Reed的"副作用"点:`ToString`通常用作"默认显示字符串",例如,通过`Console.WriteLine`或WPF数据绑定. (9认同)

Wiz*_*zou 6

还可以考虑调试器的缓慢:

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

ToString编译的代码,因此更快的调试器来执行。

这与条件断点相同:如果条件表达式太慢而无法在每次执行到达断点时被调试器解释,那么删除断点并添加如下临时代码会很有用: if (condition) Debugger.Break();


Pio*_*rak 5

"当您创建自定义类或结构时,您应该重写ToString方法,以便向客户端代码提供有关类型的信息." - MSDN

如果ToString()返回并且您在调试器中看到的不是您想要的,那么您使用DebuggerDisplayAttribute.