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

C# 调试:[DebuggerDisplay]或ToString()?,c#,debugging,tostring,debuggerdisplay,C#,Debugging,Tostring,Debuggerdisplay,有两种方法可以提高调试信息的有用性,而不是在调试器中查看{MyNamespace.MyProject.MyClass} 这些是的用法和ToString()方法 using System.Diagnostics; ... [DebuggerDisplay("Name = {Name}")] public class Person { public string Name; } 或 有什么理由选择一个而不是另一个吗?有什么理由不同时做这两件事吗?这纯粹是个人喜好吗?使用[Debugger

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

这些是的用法和
ToString()
方法

using System.Diagnostics;
...

[DebuggerDisplay("Name = {Name}")]
public class Person
{
    public string Name;
}


有什么理由选择一个而不是另一个吗?有什么理由不同时做这两件事吗?这纯粹是个人喜好吗?

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

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

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

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

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


如果
ToString()
返回的内容,并且您在调试器中看到的不是您想要的内容,那么您使用
DebuggerDisplayAttribute
也可以考虑调试器的慢度:

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

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


这与条件断点是一样的:如果每次执行到达断点时条件表达式太慢,调试器无法解释,那么删除断点并添加如下临时代码可能会很有用:
If(condition)debugger.Break()

调试程序显示
的功能非常有限。您只有一个格式字符串,可以用来显示某些成员的值


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

+1要补充Reed的“副作用”点:
ToString
通常用作“默认显示字符串”,例如通过
控制台。WriteLine
或WPF数据绑定。确定;该字符串的格式只是为了一个可视化示例而给出的,以强调其与为DebuggerDisplay提供的字符串的相似性。正如您所说,DebuggerDisplay格式也可以直接返回名称。不过,我明白你关于副作用的观点——这正是我想要的区别。我通常不会在类上太多地使用ToString方法(除了我上面给出的目的),因此它的其他用法对我来说并不明显。谢谢我认为这些功能是完全相同的,因为您可以将DebuggerDisplay指向一个计算属性。因此,您可以轻松地返回ToString()结果或您自己定制的字符串。[DebuggerDisplay(“{nameof(DebuggerDisplay)+”,nq}”)]公共记录某物{private readonly string unique;公共某物(string unique){this.unique=unique;}私有字符串DebuggerDisplay=>this.ToString();公共重写字符串ToString(){return$“{typeof(T)}:{this.unique}”;}
public class Person
{
    public string Name;
    public override string ToString()
    {
        return string.Format("Name = {0}", Name);
    }
}