前言
對於除錯的方式有多種,不過在今天我們將看到的監視視窗對變數的監視,當然在這裡我們是定製內部的變數值,或者說變數的顯示與計算的內容。
注:監視視窗在除錯時可以一次顯示多個變數。“快速監視”對話方塊一次顯示一個變數。
DebuggerDisplayAttribute
在下面示例中,我們在類上新增DebuggerDisplay,新增字串:("Name={Name},Age={Age}"):
class Program
{
static void Main(string[] args)
{
Student student = new Student()
{
Name = "Mr.A",
Age = 18
};
Console.WriteLine("Hello World!");
}
[DebuggerDisplay("Name={Name},Age={Age}")]
class Student
{
public int Age { get; set; }
public string Name { get; set; }
}
}
如下圖,在除錯模式下,我們可以將滑鼠箭頭放到變數上去,從而看到變數的值,也可以看到我們定義好的字串內容格式:
進一步來看一下,我們定義一個屬性,將屬性的內容呈現出來,程式碼片段如下所示:
[DebuggerDisplay("{DebuggerDisplay,nq}")]
public struct Point
{
public int X { get; }
public int Y { get; }
public Point(int x, int y)
{
X = x;
Y = y;
}
private string DebuggerDisplay => $"{X},{Y}";
}
對於結果已經呈現出來了,我們可以看到我們在DebuggerDisplay
屬性中定義的內容,同時我們看的是沒有引號,是的,這一點很重要,對於nq
的話他主要刪除引號,因為我們在這裡採用的是字串,所以可通過nq
進行引號的刪除
DebuggerBrowsableAttribute
對於DebuggerBrowsableAttribute
特性來說的話,他應用於屬性欄位,可控制它們的顯示方式,通過列舉型別DebuggerBrowsableState
來控制欄位屬性的顯示行為:
[DebuggerBrowsable(DebuggerBrowsableState.Never)]
public static string y = "Test String";
DebuggerBrowsableState
- Never 可隱藏欄位屬性
- Collapsed 預設選項,顯示成員資訊
- RootHidden 不顯示欄位,如果是陣列或者集合將以成對的物件形式顯示
DebuggerTypeProxyAttribute
DebuggerTypeProxyAttribute
屬性用於指定代理型別顯示,它允許我們為型別定製檢視,如果找到這個屬性,則表示式評估其將顯示代理型別替換為該屬性所應用的型別,這其實對我們來公開原始型別以外的屬性很有用。下面我們看一下程式碼示例:
[DebuggerTypeProxy(typeof(SampleDebugView))]
public class Sample
{
public string Name { get; set; }
private class SampleDebugView
{
private readonly Sample _sample;
public SampleDebugView(Sample sample)
{
_sample = sample;
}
public string Name => _sample.Name;
public int NameLength => _sample.Name.Length;
[DebuggerBrowsable(DebuggerBrowsableState.RootHidden)]
public char[] NameCharacters => _sample.Name.ToCharArray();
}
}
可以看到下圖,我們通過代理檢視的方式將我們的資訊都展開,這樣更方便我們對資訊的除錯顯示
Reference
https://docs.microsoft.com/zh-cn/dotnet/api/system.diagnostics.debuggerbrowsableattribute