C# 如何让ToString()显示在调试中

C# 如何让ToString()显示在调试中,c#,.net,debugging,visual-studio-debugging,C#,.net,Debugging,Visual Studio Debugging,我想让ToString()在调试模式下为我控制的类显示 如果这是用鼠标悬停在变量上时显示的第一件事,那就太好了。是否有此属性?您要查找的是DebuggerDisplayAttribute: 使用上面的链接查看它是如何完成的,然后将其应用于您的类,使用ToString()方法驱动显示的内容。我只使用过属性,不确定是否可以注入类。用 [System.Diagnostics.DebuggerDisplay("{ToString()}")] 测试: 现在,当您将鼠标悬停在一个变量上时,它将显示,这是

我想让ToString()在调试模式下为我控制的类显示


如果这是用鼠标悬停在变量上时显示的第一件事,那就太好了。是否有此属性?

您要查找的是
DebuggerDisplayAttribute

使用上面的链接查看它是如何完成的,然后将其应用于您的类,使用
ToString()
方法驱动显示的内容。我只使用过属性,不确定是否可以注入类。

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


现在,当您将鼠标悬停在一个变量上时,它将显示
,这是调试时显示的文本

ToString
的输出应该是调试时看到的默认值

可以使用
DebuggerDisplay
属性覆盖它(请参阅)

我更喜欢重写
ToString
方法,因为它更简单、更通用,因为它在写入日志文件时也有帮助

你看到了什么输出?如果您获得类型名称,您将看到默认的
ToString

,它允许您影响显示。不过,它允许您编写相当复杂的表达式来生成调试输出


但是,如果您已重写
ToString
,则调试器将被记录为默认显示该调试器。可能代码有问题?

在对象中重写.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()值

如果您使用的是visual studio,则可以在yourvariable.ToString()中添加watch@runtime
行,当它遇到断点时,它将显示在屏幕底部

我遇到了类似的问题。我的类有一个ToString()重写,但它仍然没有出现在VS中,这很奇怪

将属性[System.Diagnostics.DebuggerDisplay(“{ToString()}”)]添加到类中时,visual studio调试器中出现异常,ToString应该在该调试器中显示。结果发现,我的实现中错误地使用了string.Format(),出现了一个错误。 这是一个有趣的行为-VS在出现异常时会恢复为默认的ToString。
使用上述属性会强制显示方法的输出-有效或异常。这对于调试ToString()非常有用。否则,将此属性显式添加到每个类是没有意义的,因为类在默认情况下已将其打开,除非出于某种原因希望关闭此行为。

很抱歉,我的编辑按钮错误,我的还原与您的第二次编辑重叠:(@Zebi:rollback,不用担心。+1不确定隐式访问是什么意思,但我会记住这些性能问题。“如果表达式引用属性,则这些属性上的属性不会被处理”可能是我最需要警惕的事情。@sgtz:他们的意思是
这个
可以在表达式中使用(“具有访问权限”),并且您不必键入它(“隐式”)。基本上,这与
this
发生的情况完全相同,例如,在类方法内部。如果
ToString()
引发异常,那么VS debugger将不显示该值。
DebuggerDisplayAttribute
将强制显示异常消息。但通常情况下,您不需要这样做。+1只能接受一个答案,但此链接立即为我提供了一个可能的示例。谢谢大家。非常方便。可能是工具/选项/调试/“启用属性求值和其他隐式函数调用”+“调用变量窗口中对象上的字符串转换函数”。如果ToString方法引发异常,则调试局部变量将不会使用它(除非您在下面的答案中使用类属性强制它).1.ty.ToString在大多数情况下似乎是它的自然位置。虽然添加一个watch变量可以达到它的目的,但它并不能回答这个问题。问题是如何使变量在调试模式下悬停在其上时显示工具提示。
public class MyObject
{
        public int Property1{ get; set; }
        public string Property2{ get; set; }
        public string Property3 { get; set; }

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