.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

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章