有两种方法可以提高调试信息的有用性,而不是在调试器中查看{MyNamespace.MyProject.MyClass}
。
这些是DebuggerDisplayAttribute
和ToString()
方法的使用。
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);
}
}
有什么理由喜欢其中一个而不喜欢另一个呢?有什么理由不同时做两个呢?这纯粹是个人的喜好吗?
7条答案
按热度按时间kuhbmx9i1#
使用
[DebuggerDisplay]
仅适用于调试器。覆盖ToString()会有“副作用”,即在运行时更改显示。这可能是件好事,也可能不是。
通常,在调试过程中,您需要比标准
ToString()
输出更多的信息,在这种情况下,您将同时使用这两种输出。例如,在您的例子中,“ToString”实现对我来说似乎很奇怪。我希望“Person”类的ToString()实现只直接返回Name,而不是“Name = PersonsName”。但是,在调试过程中,我可能需要额外的信息。
0yg35tkg2#
还可以考虑调试器的缓慢性:
DebuggerDisplayAttribute
表达式由调试器在每个调试步骤/断点后解释。ToString
在您的代码中编译,因此调试器的执行速度要快得多。这与条件断点相同:如果每次执行到达断点时调试器都无法解释条件表达式,则删除断点并添加如下临时代码会很有用:
if (condition) Debugger.Break();
idv4meu83#
“创建自定义类或结构时,应重写ToString方法,以便向客户端代码提供有关类型的信息。”-MSDN
如果您在调试器中看到
ToString()
返回结果不是您想要结果,则使用DebuggerDisplayAttribute
qlzsbp2j4#
DebuggerDisplay
的功能非常有限。您只有一个可用于显示某些成员的值的格式字符串。如果您想要有条件地显示数据、多层数据或聚合数据,
ToString()
可能是唯一的选择。bogh5gae5#
如果您使用Xamarin为Android进行开发,则ToString方法不会显示在监视窗口中,但DebuggerDisplay会显示。
ct2axkht6#
DebuggerDisplay
在输入简单内容时速度更快。ToString()
可能会复杂得多,因为您要查看的数据取决于对象的属性。与#if DEBUG
语句合并,您将得到一个很好的仅用于调试的数据查看器。实际上,没有人将ToString()
直接用于“客户端视图”,因为它太模糊,任何更改都不可能逻辑地维护。每个人总是调用显式属性或方法,而不是ToString()
,除非提供字符串是类的唯一目的,在调试中也是如此。还有DebuggerBrowsableAttribute和DebuggerTypeProxyAttribute,但如果没有真正的需要,这些只是增加了复杂性。
hpcdzsge7#
个人偏好(当所需的输出不是100%已知时)
1.实作HelperFunction
1.根据HelperFunction实现ToString
1.根据HelperFunction实现调试器显示。
现在,未来的编辑可以根据需要区分或保持一致,并且具有更好的可跟踪性。