DebuggerDisplay 属性

添加 DebuggerDisplay 属性将改变调试器在悬停时显示类的方式。

调试器将评估包含在 {} 中的表达式。这可以是一个简单的属性,如下面的示例或更复杂的逻辑。

[DebuggerDisplay("{StringProperty} - {IntProperty}")]
public class AnObject
{
   public int ObjectId { get; set; }
   public string StringProperty { get; set; }
   public int IntProperty { get; set; }
}

StackOverflow 文档

在结束括号之前添加 ,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
}