考虑以下简单程序(使用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");
}
Run Code Online (Sandbox Code Playgroud)
控制台将报告方法的预期输出ToString.但是,在调试模式下,输出不一样.
我一直以为Visual Studio使用ToString()调用来显示这个值.但结构似乎并非如此.有人可以解释这种行为吗?我会很感激答案,这些答案也描述了这个值是如何计算的,因为看起来我的理解是不完整的.
ToString调用硬编码到不同的值会导致正常行为.不确定为什么 - 但 DebuggerDisplayAttribute 可以用于这种效果:
https://msdn.microsoft.com/en-us/library/ms228992(v=vs.110).aspx < 使用指南 https://msdn.microsoft.com/en-us/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");
}
Run Code Online (Sandbox Code Playgroud)
使用以下命令删除引号:
[DebuggerDisplay("{ToString(),nq}")]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
660 次 |
| 最近记录: |