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
}