4

この属性は C# で機能するはずですが、私の場合は機能しません。私は怠惰なプロパティChildrenを持つクラスを持っています。このプロパティにアクセスすると、サーバーへのラウンドトリップという副作用が生じる場合があります。したがって、当然のことながら、デバッガーの監視ウィンドウで監視するだけでは、これが発生することは望ましくありません。

無関係な詳細をすべて省略すると、ソースはごく普通に見えます。

[DebuggerDisplay("(Frozen) {m_children}")]
public IList<IEntityBase> Children
{
  get
  {
    if (m_children == null)
    {
      m_children = FetchChildrenFromDB(this);
    }
    return m_children;
  }
}

それでも、オブジェクトを監視thisしてウォッチ ウィンドウで展開すると、ディスプレイに (Frozen) が表示されません。つまり、デバッガーは単に属性を無視します。

DebuggerDisplay イメージのスナップショット

Reflector によると、この属性は実際に存在します。私はVS2008を使用しています。

何か案は?

4

4 に答える 4

5

ウォッチ ウィンドウに次のようなものが表示されている場合:

[+]  ObjectName    | { namespace.object}

[ツール] -> [オプション] -> [デバッグ] -> [全般] -> [変数ウィンドウにオブジェクトの生の構造を表示]がチェックされていないことを確認します。

これをクリアすると、DebuggerDisplay 属性が正しく表示されました (追加したすべての「WTF」と「Huh」の表示を含む...)。

于 2010-03-16T07:42:25.140 に答える
1

さて、私はそれをテストしたところ、私の単純なプログラムで動作します。また、考えられる説明があると思いましたが、テストでは、それが私が考えていたものではないことが示されました (コードの下の情報)。

まず、動作するコードは次のとおりです。

using System;
using System.Diagnostics;
using System.Collections.Generic;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Program p = new Program();
            Console.Out.WriteLine(p.Name); // breakpoint here
        }

        private String _Name = String.Empty;
        [DebuggerDisplay("Name: {_Name}")]
        public String Name
        {
            get { return _Name; }
            set { _Name = value; }
        }

        private IList<String> _Names = new List<String>();
        [DebuggerDisplay("Names: {_Names.Count}")]
        public IList<String> Names
        {
            get { return _Names; }
            set { _Names = value; }
        }
    }
}

私が思ったのは、FetchChildrenFromDB メソッドから取得したコレクション クラスには、独自の DebuggerDisplay 属性が関連付けられていて、それが優先されたということでした。しかし、それだけではありません。その属性がアタッチされたダミーの IList クラスを実装しましたが、プロパティにアタッチされたクラスが優先されました。

于 2009-08-19T19:39:11.297 に答える
0

DebuggerDisplayAttributem_childrenは、インスタンス フィールドであり、プロパティ コンテキストでは評価できないため、プロパティではなくクラスに配置する必要があります。

プロパティ表示は、デバッガー プロキシがないため、常にそのまま評価されます。

于 2010-03-16T07:54:40.133 に答える
0

括弧「(凍結)」が原因である可能性があると思います。
テキストの場合は「凍結」に変更してください。

ところで、「冷凍」とは何ですか?単純なテキストですか、それとも既存のプロパティですか?
編集:これは、MSDN と Lasse のコードのサンプル コードに基づいて推測したものです。

于 2009-08-19T19:43:31.473 に答える