如何使ToString()在调试中显示

19

我希望在调试模式下为我控制的类获得ToString()的输出。如果鼠标悬停在变量上时,这是第一件显示出来的东西就太好了。是否有相应的属性可以实现这个目的?


3
也许是在“工具/选项/调试/启用属性评估和其他隐式函数调用”和“在变量窗口中对对象调用字符串转换函数”的设置。 - ToolmakerSteve
如果您的ToString方法抛出异常,那么除非您在下面的答案中使用类属性强制执行它,否则调试本地变量将不会使用它。 - Elaskanator
8个回答

34

在你的类上标记

[System.Diagnostics.DebuggerDisplay("{ToString()}")]

测试:

[System.Diagnostics.DebuggerDisplay("{ToString()}")]
class MyClass
{
    private string _foo = "This is the text that will be displayed at debugging"

    public override string ToString()
    {
        return _foo;
    }
}

现在,当你用鼠标悬停在一个变量上时,它会显示 This is the text that will be displayed at debugging(这是将显示在调试中的文本)。


10

有一个DebuggerDisplayAttribute,它允许您影响显示方式。它允许您编写相当复杂的表达式来生成调试输出,尽管不建议这样做

但是,如果您已经覆盖了ToString,那么文档中记录了调试器默认显示该方法的返回结果。也许代码有问题?


+1 不确定他们所说的隐式访问意味着什么,但我会记住这些性能问题。 “如果表达式引用属性,则不处理这些属性上的属性” 对我来说可能是需要警惕的最大问题。 - sgtz
@sgtz:他们的意思是在表达式中“可用”使用this,而你不必输入它(“隐式”)。基本上就像在类方法内部使用this一样。 - Jon
4
如果 ToString() 方法发生 异常,则 VS 调试器将不会显示该值。DebuggerDisplayAttribute 将强制显示异常消息。但通常情况下,您不应该这样做。 - swdev
你知道为什么调试器在我的集合中添加两个以上的元素时停止显示toString()吗? - Ed_

7
ToString的输出应该是在调试时看到的默认输出。您可以使用DebuggerDisplay属性进行覆盖(请参见MSDN)。
我更喜欢覆盖ToString方法,因为它更容易和更通用,因为它有助于写入日志文件。
您看到的输出是什么?如果您获得类型名称,则会看到默认的ToString

1
+1. 谢谢。在大多数情况下,ToString似乎是最自然的位置。 - sgtz

6
我遇到了类似的问题。我的类有一个ToString()覆盖,但在VS中仍然没有显示出来,这很奇怪。
将属性[System.Diagnostics.DebuggerDisplay("{ToString()}")]添加到该类中,在可视化工具调试器中会显示异常,此时应该显示ToString。结果表明我在实现中错误地使用了string.Format()。这是一种有趣的行为 - 在发生异常时,VS会恢复默认的ToString。
提到的属性的使用强制显示方法的输出 - 无论是有效还是异常。这对于调试ToString()非常有用。否则,除非有人想要关闭此行为,否则没有必要在每个类中显式添加此属性,因为类默认已启用该行为。

4

+1 只能接受一个答案,但这个链接给了我一个立即可见的例子,说明什么是可能的。 - sgtz

2

在对象中重写 .ToString 如下:

public class MyObject
{
        public int Property1{ get; set; }
        public string Property2{ get; set; }
        public string Property3 { get; set; }

        public override string ToString()
        {
            return Property3;
        }
}

这将返回Property3作为ToString()的值。

0
如果您正在使用Visual Studio,您可以在运行时添加一个观察窗口到yourvariable.ToString()行,这将在命中断点时显示在屏幕底部。

1
虽然添加监视变量有其作用,但它并不能回答问题。问题是如何使您的变量在调试模式下悬停时显示工具提示。 - John C

0
我的问题是,尽管我在一个类中重写了ToString()方法,但调试器仍然没有显示ToString()的内容。原因是基类已经有了DebuggerDisplay属性,这个属性优先于派生类的ToString()方法。解决方法是也在派生类中添加DebuggerDisplay属性:
[DebuggerDisplay("Name: {Name}")]
class Base
{
    public string Name { get; set; }
}

// Add this line to show the Address instead of Name in the debugger.
[DebuggerDisplay("{ToString()}")]
class Derived : Base
{
    public string Address { get; set; }

    public override string ToString()
    {
        return $"Address: {Address}";
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接