2016-09-13 27 views
0

:なぜクイックウォッチウィンドウに "Mscorlib_CollectionDebugView"が追加され、リスト式<T>の要素式に追加されますか?例えば

var p = new { 
    rg = new List<string> { 
     "one", 
     "two", 
    } 
}; 

クイックウォッチp、およびツリーのp.rg[0]をクリックしてください。

式は次のようになります。new System.Collections.Generic.Mscorlib_CollectionDebugView<string>(p.rg).Items[0]

は何このナンセンスである、そしてどのように私はそれを取り除くのですか?

答えて

0

[式]テキストボックスには、ツリー内で選択したノードの完全な名前が表示されます。フルネームは、選択した値だけを表示する場合に評価する必要がある式です。
List<T>は配列ではなく、実際には[0]という名前のメンバーを持っていません。 「Raw View」を見ると、実際の実装メンバーList<T>が表示されます。ほとんどの人は実装を気にせず、リスト内の項目だけを見たいと思っています。このため、List<T>にはDebuggerTypeProxyがあります。型プロキシを使用すると、デバッガ内のオブジェクトのビューをカスタマイズできます。 List<T>の場合、タイププロキシはMscorlib_CollectionDebugViewです。要素0を直接評価するには、型プロキシをインスタンス化し、要素0(TypeProxy.Items[0])の値を取得する必要があります。

+0

ええ、List は "this [int]"を実装しているので、 "p.rg [0]"はその要素に対して有効な式です。私は「ほとんどの人が実装を気にしない」と理解していますが、「DebuggerTypeProxy」などの内部デバッガ実装については、誰が気になりますか?木の内部のメンバーを隠す長さに行くなら、余分に行くことはできませんし、表現のコンボでプロキシを隠すことはできませんか? – Spongman

+0

@ Spongman、理論上はデバッガが "this []"を使用できることは間違いありません。問題は "this []"はC#の構文的な砂糖です。実際にはリストのメンバーであるコンパイラー生成インデクサーにマップされます。デバッガは言語にとらわれないように設計されているので、 "this []"を使用するのはちょっとしたハックです。不快な表現を隠すという点で、これらの生成された表現のいくつかを見るのは醜いことに同意します。しかし、私は開発者として、式を受け取り、再度評価する前にそれを修正するオプションが好きです。 –

+0

ここで、use-caseはDebuggerTypeProxiesを見るのに便利ですか?私が考えることができる唯一のものは、それらのプロキシまたはデバッガ自体を開発している場合です。それ以外の99.99%の時間はノイズです。私は、既存のデザインがそれらを隠すことを難しくしていることを理解しますが、私はそれが本当に正当だとは思わない。 – Spongman

関連する問題