12

次の C# コード行の場合:

BitArray bitty = new BitArray(new[] {false, false, true, false});

ウォッチ ウィンドウで "bitty" と評価すると、コレクションのメンバーが表示されません。IEnumerable を列挙して結果を表示することになっている "bitty, results" を評価すると、BitArray が IEnumerable であっても、"Only Enumerable types can have Results View" というメッセージが表示されます。

デバッガーがこれを行うのはなぜですか?

明確化: デバッガで BitArray を表示する方法を尋ねるのではなく、VS Debugger Expression Evaluator 内で何が起こっているのかを尋ねています..

4

1 に答える 1

15

結果ビューは、次の条件を満たすコレクションに対してのみ機能します。

  1. 実装IEnumerable<T>またはIEnumerable (VB.Net は に対してのみ機能しIEnumerable<T>ます)
  2. 、、または実装しない(C# の制限のみ)IListIList<T>ICollectionICollection<T>
  3. 属性を持たないDebuggerTypeProxy
  4. System.Core.dll が debugee プロセスに読み込まれます

この場合、 と の両方をBitArray実装します。後者は、結果ビューで使用する資格を失います。IEnumerableICollection

これを回避する 1 つの方法は、Cast拡張メソッドを使用することです。これによりIEnumerable<T>、結果ビューを使用できる値が生成されます

bitty.Cast<bool>(), results

#2 の理由は、次の要因の組み合わせです。

  • 結果ビューは、もともと非常に具体的な問題を解決するために考案されました。C# イテレータ (および拡張 LINQ クエリ) のデバッグ エクスペリエンスが貧弱でした。の内容を表示する良い方法がまったくありませんでしたIEnumerable<T>
  • 結果ビューは無料ではなく、非常に具体的なリスクがあります。特に、コレクション全体を積極的かつ同期的にメモリにロードします。これにより、データベース クエリに基づくコレクション、非常に大きなコレクションまたは無限のコレクションで問題が発生する可能性があります。
  • すべての既知IList/<T>ICollection<T>タイプには、コンテンツを表示できるメソッドが既にあります

したがって、C# チームは、リスクを最小限に抑え、IEnumerable<T>既に適切に表示されていると感じた型には追加しないことにしました。VB.Net は他の方向を選択し、任意のIEnumerable<T>.

当然のことながら、2 つのチームが同じデータを見て異なる決定を下す方法を尋ねるかもしれません。それは視点ともちろん時間に帰着します。VB.Net チームは、優れた LINQ デバッグ エクスペリエンスを提供することに非常に熱心でした。VB.Net には豊富なデバッグ + ENC エクスペリエンスを提供してきた長い歴史があるため、この種のリスクに慣れていて、喜んで引き受け、さらにそれをテストするための帯域幅もありました。C# は単純にリスク回避的であり、スケジュールが非常にタイトであり、実用的に反対することを決定しました。

注:IEnumerableサポートされていないことについて以前に混乱したのは、VB 式エバリュエーターが実際にそうであったためです。C# 式エバリュエーターはIEnumerable、上記の規則に従ってサポートします。

于 2011-04-04T21:01:20.753 に答える