在Visual Studio调试模式下,结构体和类如何显示值

5
考虑以下简单程序(使用Visual Studio 2015):
public class Program
{
    public static void Main(string[] args)
    {
        var dtClass = new MyDateTimeWrapperClass(DateTime.Today);
        var dtStruct = new MyDateTimeWrapperStruct(DateTime.Today);
        WriteLine(dtClass);
        WriteLine(dtStruct);
        ReadKey();
    }
}

public class MyDateTimeWrapperClass
{
    private readonly DateTime _value;

    public MyDateTimeWrapperClass(DateTime value)
    {
        _value = value;
    }

    public override string ToString() => _value.ToString("MM/dd/yyyy");
}

public struct MyDateTimeWrapperStruct
{
    private readonly DateTime _value;

    public MyDateTimeWrapperStruct(DateTime value)
    {
        _value = value;
    }

    public override string ToString() => _value.ToString("MM/dd/yyyy");
}

控制台将报告ToString方法的预期输出。然而,在调试模式下,输出不同。

enter image description here

我一直认为Visual Studio使用ToString()调用来显示此值。然而,对于结构体来说似乎不是这种情况。有人能解释一下这种行为吗?我希望回答时也能描述一下首先如何计算这个值,因为我的理解好像不完整。
更新:附加信息
  1. 在使用Visual Studio 2013时,不会出现此问题。
  2. ToString调用硬编码为不同的值会导致正常行为。

输出有什么不同之处? - GrandMasterFlush
1
@GrandMasterFlush 一个打印日期,一个打印日期和时间。 - Yuval Itzchakov
我会打赌也是这样,调试器调用toString()方法来显示值。你能不能尝试避免使用任何的WriteLine,并在结构体的ToString()方法中插入一个异常?看看调试器会发生什么? - Gian Paolo
当我使用您的代码进行复制时,我在调试器和控制台中都看到了相同的“MM/dd/yyyy”格式。在两种情况下(类/结构体),调试器都会调用ToString()重写。您可以通过放置一个Console.Write(...)来确认这一点,以记录一些消息,并在调试器停止在Console.ReadKey()时检查控制台窗口,您应该可以看到从ToString()重写中打印出的消息。 - Siva Gopal
我能够重现它并找到了解决方法-请查看答案。 - Chris
显示剩余3条评论
1个回答

3

不确定为什么,但DebuggerDisplayAttribute可以用于此效果:

https://msdn.microsoft.com/zh-cn/library/ms228992(v=vs.110).aspx < 使用指南 https://msdn.microsoft.com/zh-cn/library/x810d419.aspx < 显示可应用的类型

类似以下代码可行:

[DebuggerDisplay("{ToString()}")]
public struct MyDateTimeWrapperStruct
{
    private readonly DateTime _value;

    public MyDateTimeWrapperStruct(DateTime value)
    {
        _value = value;
    }

    public override string ToString() => _value.ToString("MM/dd/yyyy");
}

使用以下内容来删除引号:
[DebuggerDisplay("{ToString(),nq}")]

谢谢Chris!这非常有帮助和有趣。因为我的问题不是关于如何消除这种行为,而是理解这种行为本身,所以我选择不将其标记为答案。 - Will Ray
NP - 很高兴你觉得有帮助。我也很想知道为什么。 - Chris

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