5

XElementなどの特定の型の変数をVisual Studio の [ウォッチ] ウィンドウで表示しているときに、[デバッグ ビジュアライザー] 虫めがねをクリックすると、文字列 (テキスト、XML、HTML) に適用される同じビジュアライザーが表示されることに気付きました。これが他のタイプで発生するのを見たことがありません。デバッガーはこれをどのように決定しますか?

編集: これは [ウォッチ] ウィンドウのスクリーンショットで、XElement がテキスト ビジュアライザーで表示されることを示していますが、System.Version (ToString も実装しています) は表示されません。 ここに画像の説明を入力

4

2 に答える 2

5

カスタム ビューアの表示を制御する式エバリュエータが複数あるため、これは実際には少し複雑な問題です。

テキスト、XML、および HTML ビューアの場合、これらはデバッガに組み込まれたビジュアライザであるため、答えは非常に簡単です。IDebugProperty2::GetPropertyInfo属性フラグの一部として返される場合DBG_ATTRIB_VALUE_RAW_STRING、このビジュアライザが表示されます。IDebugProperty3::GetStringChars / GetStrigCharLengthユーザーがこれらのビューアーを選択すると、ビジュアライザーに渡す文字列値を取得するために、デバッガーがコールバックします。

ユーザー定義のビジュアライザーの場合は、かなり複雑ですが、ここでの回答にはおそらく多すぎます。MSDN には、これを行う方法に関する情報が少しありますが、

http://msdn.microsoft.com/en-us/library/vstudio/bb162331(v=vs.100).aspx http://msdn.microsoft.com/en-us/library/vstudio/bb146621(v= vs.100).aspx

ここで、この質問で呼び出された特定の例を考えてみましょう: Versionvs. XElement. 最初に注意すべきことは、デバッグしている言語によって動作が異なることです。お気づきのように、C# は のビジュアライザーのみを表示しますが、XElementVB.Net は と の両方のビジュアライザーを表示しXElementますVersion。ビジュアライザー フラグは EE によって制御され、各言語には独自の実装があるため、これはいくつかの点で驚くべきことではありません。

C# アルゴリズム

値が に入力されてStringいるか、暗黙の参照変換があるXNode場合、ビジュアライザーが表示されます。

この場合XElementはから派生するXNodeため、ビジュアライザーを取得します。Versionタイプは派生元ではXNodeなく、Stringそうではないため、ビジュアライザーを取得しません

VB.Net アルゴリズム

表示されている値が次のいずれかを満たす場合、ビジュアライザーが表示されます

  1. StringまたはToStringオーバーライドがあります
  2. DebuggerDisplay1 または 2 に相当する値を指す を持っている

この場合、両方ともXElementオーバーライドVersionToStringれるため、両方のケースでビジュアライザーが表示されます

違いはなぜですか?

私を殴る。VB.Net の実装を作成したとき、できるだけ多くの場所でビジュアライザーをサポートしたいと考えていました (これは非常に便利です)。したがって、表示される最終的な値が常にStringビジュアライザーを表示していました。この決定を下したとき、C# チームに相談しようとは思いもしませんでした。この質問に答えるためにコードベースを調査するまで、違いがあることにさえ気づきませんでした:)

于 2014-02-27T19:37:45.597 に答える
0

デバッガーはこれをどのように決定しますか?

オブジェクトの種類に応じて、ビジュアライザーのレジストリがあります。

自分で書くのは自由です。

ビジュアライザーが表示されない場合は、単に何も登録されていません。また、VS には優れた標準的なものがいくつか付属しています。

于 2014-02-27T19:40:10.640 に答える