debugging C#两柴:[调试器显示]还是ToString()?

dgjrabp2  于 2022-11-14  发布在  C#
关注(0)|答案(7)|浏览(163)

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

有什么理由喜欢其中一个而不喜欢另一个呢?有什么理由不同时做两个呢?这纯粹是个人的喜好吗?

kuhbmx9i

kuhbmx9i1#

使用[DebuggerDisplay]仅适用于调试器。覆盖ToString()会有“副作用”,即在运行时更改显示。
这可能是件好事,也可能不是。
通常,在调试过程中,您需要比标准ToString()输出更多的信息,在这种情况下,您将同时使用这两种输出。
例如,在您的例子中,“ToString”实现对我来说似乎很奇怪。我希望“Person”类的ToString()实现只直接返回Name,而不是“Name = PersonsName”。但是,在调试过程中,我可能需要额外的信息。

0yg35tkg

0yg35tkg2#

还可以考虑调试器的缓慢性:
DebuggerDisplayAttribute表达式由调试器在每个调试步骤/断点后解释
ToString在您的代码中编译,因此调试器的执行速度要快得多。
这与条件断点相同:如果每次执行到达断点时调试器都无法解释条件表达式,则删除断点并添加如下临时代码会很有用:if (condition) Debugger.Break();

idv4meu8

idv4meu83#

“创建自定义类或结构时,应重写ToString方法,以便向客户端代码提供有关类型的信息。”-MSDN
如果您在调试器中看到ToString()返回结果不是您想要结果,则使用DebuggerDisplayAttribute

qlzsbp2j

qlzsbp2j4#

DebuggerDisplay的功能非常有限。您只有一个可用于显示某些成员的值的格式字符串。
如果您想要有条件地显示数据、多层数据或聚合数据,ToString()可能是唯一的选择。

bogh5gae

bogh5gae5#

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

ct2axkht

ct2axkht6#

DebuggerDisplay在输入简单内容时速度更快。
ToString()可能会复杂得多,因为您要查看的数据取决于对象的属性。与#if DEBUG语句合并,您将得到一个很好的仅用于调试的数据查看器。实际上,没有人将ToString()直接用于“客户端视图”,因为它太模糊,任何更改都不可能逻辑地维护。每个人总是调用显式属性或方法,而不是ToString(),除非提供字符串是类的唯一目的,在调试中也是如此。
还有DebuggerBrowsableAttributeDebuggerTypeProxyAttribute,但如果没有真正的需要,这些只是增加了复杂性。

hpcdzsge

hpcdzsge7#

个人偏好(当所需的输出不是100%已知时)
1.实作HelperFunction
1.根据HelperFunction实现ToString
1.根据HelperFunction实现调试器显示。
现在,未来的编辑可以根据需要区分或保持一致,并且具有更好的可跟踪性。

相关问题