.NET中使用DebuggerDisplay輕鬆訂製調試

前言

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

註:監視窗口在調試時可以一次顯示多個變數。「快速監視」對話框一次顯示一個變數。

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

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

Tags: