.NET中使用DebuggerDisplay輕鬆定製除錯

HueiFeng發表於2021-02-12

前言

對於除錯的方式有多種,不過在今天我們將看到的監視視窗對變數的監視,當然在這裡我們是定製內部的變數值,或者說變數的顯示與計算的內容。

注:監視視窗在除錯時可以一次顯示多個變數。“快速監視”對話方塊一次顯示一個變數。

file

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; }
        }
    }

如下圖,在除錯模式下,我們可以將滑鼠箭頭放到變數上去,從而看到變數的值,也可以看到我們定義好的字串內容格式:

file

進一步來看一下,我們定義一個屬性,將屬性的內容呈現出來,程式碼片段如下所示:

        [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進行引號的刪除

file

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();
        }
    }

可以看到下圖,我們通過代理檢視的方式將我們的資訊都展開,這樣更方便我們對資訊的除錯顯示

file

Reference

https://docs.microsoft.com/zh-cn/dotnet/api/system.diagnostics.debuggerbrowsableattribute

相關文章