いろいろ備忘録日記

主に .NET と Python絡みのメモを公開しています。

.NET クラスライブラリ探訪-070 (System.Diagnostics.DebuggerDisplayAttribute, デバッグ時のオブジェクト表示方法を制御)

久しぶりの小ネタ。

DebuggerDisplay属性とは

この属性を付与すると、デバッグ時のオブジェクトの表示内容が制御できます。

意外と知られていないのか、いちいち付与するのが面倒なのか分かりませんが

個人的にはあまりお目にかかったことはなかったり。データクラスに対して

付与しておくと、結構地味に便利です。

使い方

以下のようにします。

        /// <summary>
        /// DebuggerDisplay属性を付与したクラス
        /// </summary>
        [DebuggerDisplay("{Id}: Name={Name}, Value={Value}")]
        private class WithDebuggerDisplayAttr
        {
            public int Id { get; set; }
            public string Name { get; set; }
            public string Value { get; set; }
        }

属性のコンストラクタに、表示したい内容の文字列を渡します。

クラス自身のプロパティが指定できるので、ここでログメッセージのように

分かりやすい内容で書式化しておきます。

サンプル

以下、サンプルです。

using System;
using System.Diagnostics;
using System.Diagnostics.CodeAnalysis;
using TryCSharp.Common;
// ReSharper disable MemberCanBePrivate.Local

namespace TryCSharp.Samples.Advanced
{
    /// <summary>
    /// DebuggerDisplay属性についてのサンプルです。
    /// </summary>
    [SuppressMessage("ReSharper", "HeapView.BoxingAllocation")]
    public class DebuggerDisplayAttributeSamples01 : IExecutable
    {
        public void Execute()
        {
            var rnd = new Random();

            // --------------------------------------------------------
            // このクラスには DebuggerDisplay属性を付与している
            // ので、デバッグ時に属性に指定した内容が表示される
            // --------------------------------------------------------
            var data01 = new WithDebuggerDisplayAttr
            {
                Id = 1,
                Name = $"Name-{rnd.Next()}",
                Value = $"Val-{rnd.Next()}"
            };

            // --------------------------------------------------------
            // このクラスには DebuggerDisplay属性を付与していない
            // ので、デバッグ時に通常通りFQCNが表示される
            // --------------------------------------------------------
            var data02 = new WithoutDebuggerDisplayAttr
            {
                Id = 2,
                Name = $"Name-{rnd.Next()}",
                Value = $"Val-{rnd.Next()}"
            };

            Output.WriteLine(data01);
            Output.WriteLine(data02);
        }

        /// <summary>
        /// DebuggerDisplay属性を付与したクラス
        /// </summary>
        [DebuggerDisplay("{Id}: Name={Name}, Value={Value}")]
        private class WithDebuggerDisplayAttr
        {
            public int Id { get; set; }
            public string Name { get; set; }
            public string Value { get; set; }
        }

        /// <summary>
        /// DebuggerDisplay属性を付与していないクラス
        /// </summary>
        private class WithoutDebuggerDisplayAttr
        {
            public int Id { get; set; }
            public string Name { get; set; }
            public string Value { get; set; }
        }
    }
}

結果

デバッガで見ると、以下の画像のように指定した書式化文字列状態で表示されます。

f:id:gsf_zero1:20170410020815p:plain

ソースコード

ソースコードは以下の場所で見れます。

github.com

参考情報

https://msdn.microsoft.com/ja-jp/library/system.diagnostics.debuggerdisplayattribute(v=vs.110).aspx


過去の記事については、以下のページからご参照下さい。

サンプルコードは、以下の場所で公開しています。