繁体   English   中英

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

[英]C# debugging: [DebuggerDisplay] or ToString()?

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM