集合数据类型的监视问题
以 Person 类为例:
public class Person
{
public string FirstName { get; set; }
public string LastName { get; set; }
}
当监视 List
除非你像下面这样再展开一次。但有时候要花很长时间才能找到目标值。
该问题最常见的处理方法是重写 Person 类的 ToString() 方法,然后在调试时将数据打印出来。
现在通过 DebuggerDisplay 我们可以更优雅的解决该问题。
DebuggerDisplay
官方文档:Tell the debugger what to show using the DebuggerDisplay Attribute
扩展阅读:DebuggerDisplay attribute best practices
修改 Person 类,添加 DebuggerDisplay 特性:
public class Person
{
[DebuggerDisplay("{LastName,nq},{FirstName.Length >= 5 ? FirstName.Substring(0, 5) : FirstName, nq}")]
public string FirstName { get; set; }
public string LastName { get; set; }
}
注:nq 表示调试输出时去掉字符串前后的引号。
效果:
DebuggerTypeProxy
除了 DebuggerDisplay,对于原始类型可以使用 DebuggerTypeProxy。
下面以优化 byte[] 的监视为例(参考自 SOF)。
未优化前,必须展开才能看到数组内部的值:
创建针对 byte[] 的 Debug View:
public class ByteArrayHexView
{
[DebuggerBrowsable(DebuggerBrowsableState.Never)]
private byte[] array;
public string Hex => String.Join(", ", array.Select(x => $"0x{x:X2}"));
public ByteArrayHexView(byte[] array)
{
this.array = array;
}
}
通过 DebuggerTypeProxy 指定 byte[] 类型的 Debug View:
[assembly: DebuggerTypeProxy(typeof(ByteArrayHexView), Target = typeof(byte[]))]
namespace ConsoleTest
{
static class Program
{
static void Main()
{
var bytes = new byte[] {0x01, 0x02, 0x03};
}
}
}
优化后的效果:
注:最完美的效果应该是直接在 {byte[3]}
那个位置显式 Hex,但折腾了一阵暂时没找到方法。