97

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

有什么理由更喜欢其中一个吗?有什么理由不两者都做?纯粹是个人喜好吗?

4

5 回答 5

103

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

这可能是也可能不是一件好事。

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

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

于 2010-07-06T23:53:23.777 回答
7

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

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

于 2014-12-29T23:10:38.873 回答
7

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

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

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

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

于 2018-03-01T10:01:35.600 回答
0

如果使用 Xamarin 为 Android 开发,ToString 方法将不会显示在监视窗口中,但 DebuggerDisplay 会。

于 2021-10-27T20:47:53.220 回答
0

DebuggerDisplay它所能做的非常有限。您只有一个格式字符串,可用于显示某些成员的值。

如果您想有条件地显示数据,来自多个级别的数据或聚合数据ToString()可能是您唯一的选择。

于 2020-12-23T15:15:34.453 回答