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