27

次のクラスについて考えてみます。

[DebuggerDisplay("{GetType().Name,nq}: FileName = {FileName,nq}")]
public class FileWrapper
{
    public string FileName { get; set; }
    public bool IsTempFile { get; set; }
    public string TempFileName { get; set; }
}

プロパティに基づいてデバッガー表示を追加したいと思いIsTempFileNameます。, TempFileName = {TempFileName,nq}インスタンスが一時ファイルの場合に文字列を追加したいと思います。どうすればこれを達成できますか?

4

4 に答える 4

34

条件演算子(?:)を使用できます

[DebuggerDisplay("{GetType().Name,nq}: FileName = {FileName,nq}{IsTempFile ? \", TempFileName: \" + TempFileName : System.String.Empty,nq}")]

IsTempFile == false

ここに画像の説明を入力してください


IsTempFile == true

ここに画像の説明を入力してください

于 2012-10-15T09:50:43.950 に答える
9

有効な式なら何でも使用できます。

ただし、デバッガーはこれらの式を頻繁に評価するため、式を複雑にするほど、デバッグ速度の低下に気付くようになります(コードをステップ実行する場合など)。

考慮すべきもう1つの重要な点は、式がクラスを使用する言語のデバッガーによって評価されることです。クラスとそのすべての潜在的なユーザーの両方がC#である場合、問題はなく、三項演算子などを使用できます。ただし、クラスが別の言語からも使用される場合は、次のようにします。

  1. デバッガーが[DebuggerDisplay]属性を使用するという保証はありません。
  2. 含まれている場合、{expression}ブロックを評価しようとする保証はありません。
  3. 何か凝ったことを始めた場合(?:)を使用し始めると、C#式の評価に失敗する可能性が非常に高くなります。

最も安全なのは、プライベートプロパティを追加してデバッガーの値を計算することです。

[DebuggerDisplay("{DebugValue,nq}")]
public class FileWrapper {

  public string FileName     { get; set; }
  public bool   IsTempFile   { get; set; }
  public string TempFileName { get; set; }

  private string DebugValue {
    get {
      var text = string.Format("{0}: FileName={1}", this.GetType(), this.FileName);
      if (this.IsTempFile)
        text += string.Format(", TempFileName={0}", this.TempFileName);
      return text;
    }
  }

}

これは私有財産であるため、潜在的なサブクラスの邪魔になりません。

于 2014-03-07T14:58:51.163 に答える
1

まず、私の前に「ナマケモノ」の答えに賛成票を投じてください。なぜなら、彼らは私を正しい方向に導いてくれたからです。

第二に、ここに記事があります:

https://devblogs.microsoft.com/visualstudio/customize-object-displays-in-the-visual-studio-debugger-your-way/

上記のリンクが将来消滅した場合に備えて、以下は記事の名前と著者です。

VisualStudioデバッガーでオブジェクトの表示をカスタマイズする

レスリー・リチャードソン

プログラムマネージャー、Visual Studio Debugging&Diagnostics

第3に、nullまたはnullでない子コレクションに基づくもう少し一般的な例を次に示します。

[System.Diagnostics.DebuggerDisplay("ParentName = '{ParentName}', MyKidsCount='{null == MyKids ? 0 : MyKids.Count}'")]
public class MyParent
{
    public string ParentName { get; set; }

    public ICollection<MyKid> MyKids { get; set; }
}
于 2020-01-23T17:56:57.757 に答える
1

Extensionsメソッドで使用できます。

using System;
using System.Linq;
using System.Diagnostics;
using System.ComponentModel;

namespace ConsoleApplicationDebuggerDisplay
{
    class Program
    {
        static void Main(string[] args)
        {
            MyObject o1 = new MyObject();
            MyObject o2 = new MyObject();
            o1.Items = new int[] { 1, 2, 3, 4 };
        }
    }

    [DebuggerDisplay("{DebuggerDisplay,nq}")]
    public class MyObject
    {
        [DebuggerDisplay("{Items.ToDebuggerDisplay(),nq}")]
        public int[] Items { get; set; }

        [DebuggerBrowsable(DebuggerBrowsableState.Never), Browsable(false)]
        internal string DebuggerDisplay
        {
            get
            {
                return string.Format("{{Items={0} ...}}"
                    , Items.ToDebuggerDisplay()
                    );
            }
        }
    }

    internal static class Extensions
    {
        public static bool IsNull(this object o)
        {
            return object.ReferenceEquals(o, null);
        }

        public static bool IsNotNull(this object o)
        {
            return !object.ReferenceEquals(o, null);
        }

        public static string ToDebuggerDisplay<T>(this System.Collections.Generic.IEnumerable<T> items)
        {
            if (items.IsNull())
                return "null";
            return string.Format("{{Count={0}}}", items.Count());
        }
    }
}

時計

于 2020-03-31T13:23:49.480 に答える