前言
對於調試的方式有多種,不過在今天我們將看到的監視窗口對變量的監視,當然在這里我們是定制內部的變量值,或者說變量的顯示與計算的內容。
注:監視窗口在調試時可以一次顯示多個變量。“快速監視”對話框一次顯示一個變量。
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