カスタム ビューアの表示を制御する式エバリュエータが複数あるため、これは実際には少し複雑な問題です。
テキスト、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
ここで、この質問で呼び出された特定の例を考えてみましょう: Version
vs. XElement
. 最初に注意すべきことは、デバッグしている言語によって動作が異なることです。お気づきのように、C# は のビジュアライザーのみを表示しますが、XElement
VB.Net は と の両方のビジュアライザーを表示しXElement
ますVersion
。ビジュアライザー フラグは EE によって制御され、各言語には独自の実装があるため、これはいくつかの点で驚くべきことではありません。
C# アルゴリズム
値が に入力されてString
いるか、暗黙の参照変換があるXNode
場合、ビジュアライザーが表示されます。
この場合XElement
はから派生するXNode
ため、ビジュアライザーを取得します。Version
タイプは派生元ではXNode
なく、String
そうではないため、ビジュアライザーを取得しません
VB.Net アルゴリズム
表示されている値が次のいずれかを満たす場合、ビジュアライザーが表示されます
String
またはToString
オーバーライドがあります
DebuggerDisplay
1 または 2 に相当する値を指す を持っている
この場合、両方ともXElement
オーバーライドVersion
さToString
れるため、両方のケースでビジュアライザーが表示されます
違いはなぜですか?
私を殴る。VB.Net の実装を作成したとき、できるだけ多くの場所でビジュアライザーをサポートしたいと考えていました (これは非常に便利です)。したがって、表示される最終的な値が常にString
ビジュアライザーを表示していました。この決定を下したとき、C# チームに相談しようとは思いもしませんでした。この質問に答えるためにコードベースを調査するまで、違いがあることにさえ気づきませんでした:)