DebuggerDisplay 属性
添加 DebuggerDisplay
属性将改变调试器在悬停时显示类的方式。
调试器将评估包含在 {}
中的表达式。这可以是一个简单的属性,如下面的示例或更复杂的逻辑。
[DebuggerDisplay("{StringProperty} - {IntProperty}")]
public class AnObject
{
public int ObjectId { get; set; }
public string StringProperty { get; set; }
public int IntProperty { get; set; }
}
在结束括号之前添加 ,nq
会在输出字符串时删除引号。
[DebuggerDisplay("{StringProperty,nq} - {IntProperty}")]
即使在 {}
中允许使用通用表达式,也不建议使用。DebuggerDisplay
属性将作为字符串写入程序集元数据。{}
中的表达式未进行有效性检查。因此,包含比一些简单算法更复杂的逻辑的 DebuggerDisplay
属性在 C#中可能正常工作,但在 VB.NET 中评估的相同表达式可能在语法上无效并且在调试时产生错误。
让 DebuggerDisplay
更加语言不可知的一种方法是在方法或属性中编写表达式,然后调用它。
[DebuggerDisplay("{DebuggerDisplay(),nq}")]
public class AnObject
{
public int ObjectId { get; set; }
public string StringProperty { get; set; }
public int IntProperty { get; set; }
private string DebuggerDisplay()
{
return $"{StringProperty} - {IntProperty}"";
}
}
有人可能希望 DebuggerDisplay
输出全部或部分属性,并在调试和检查对象的类型时。
下面的示例还包含使用 #if DEBUG
的辅助方法,因为 DebuggerDisplay
用于调试环境。
[DebuggerDisplay("{DebuggerDisplay(),nq}")]
public class AnObject
{
public int ObjectId { get; set; }
public string StringProperty { get; set; }
public int IntProperty { get; set; }
#if DEBUG
private string DebuggerDisplay()
{
return
$"ObjectId:{this.ObjectId}, StringProperty:{this.StringProperty}, Type:{this.GetType()}";
}
#endif
}