C#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输出所有或仅一些属性,并且在调试和检查对象的类型时也可能要输出。
下面的示例还将调试方法中使用的#ifDEBUGas包围在helper方法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 }