DebuggerDisplay 属性の使用
更新 : 2007 年 11 月
このトピックの内容は、次の製品に該当します。
Edition |
Visual Basic |
C# |
C++ |
Web Developer |
---|---|---|---|---|
Express |
||||
Standard |
||||
Pro/Team |
表の凡例 :
対象 |
|
該当なし |
|
既定で非表示のコマンド |
DebuggerDisplay 属性 (System.Diagnostics.DebuggerDisplayAttribute) は、デバッガの変数ウィンドウでクラスやフィールドを表示する方法を制御します。この属性は次の対象に適用できます。
クラス
構造体
デリゲート
列挙型
フィールド
プロパティ
アセンブリ
DebuggerDisplay 属性の引数は 1 つです。それは、型のインスタンスの値列に表示する文字列です。この文字列には、中かっこ ({ と }) を含めることができます。かっこ内のテキストは、フィールド、プロパティ、またはメソッドとして評価されます。
C# コードでは、中かっこ内で一般的な式を使用できます。この式には、対象となる型の現在のインスタンスのみへの this ポインタに対する暗黙的なアクセスがあります。この式には、エイリアス、ローカル、またはポインタに対するアクセスはありません。式からプロパティを参照しても、そのプロパティに関する属性は処理されません。
C# オブジェクトにオーバーライドされた ToString() がある場合、デバッガはそのオーバーライドを呼び出し、標準の {<typeName>} ではなく、その結果を表示します。したがって、オーバーライドされた ToString() がある場合、DebuggerDisplay を使用する必要はありません。両方を使用すると、DebuggerDisplay 属性が ToString() オーバーライドよりも優先されます。
この暗黙的な ToString() 呼び出しがデバッガで評価されるかどうかは、[オプション] ダイアログ ボックス ([全般] ページの [デバッグ] カテゴリ) のユーザー設定に応じて変わります。Visual Basic には、この暗黙的な ToString() 評価は実装されていません。
次の表に、DebuggerDisplay 属性の使用例と出力例を示します。
属性 |
[値] 列に表示される出力 |
---|---|
[DebuggerDisplay("x = {x} y = {y}")] x フィールドと y フィールドがある型で使用されます。 |
x = 5 y = 18 |
[DebuggerDisplay("String value is {getString()}")] パラメータの構文は、言語によって異なります。そのため、使用には注意が必要です。 |
String value is [5, 6, 6] |
[DebuggerDisplay("Object {count - 2}: {(flag) ? \"yes\" : \"no\"}")] 式の構文は言語によって異なります。そのため、使用には注意が必要です。 |
Object 6: yes |
[DebuggerDisplay("Last = {_lastName,nq} {_var == null ? \"\" : \"First = \" + _firstName,nq}")] ,nq は、引用符を除去します。 |
姓が表示されている場合 Last = lastname First = firstname 姓が表示されていない場合 Last = lastname |
DebuggerDisplay には、名前付きパラメータも使用できます。
パラメータ |
目的 |
---|---|
Name, Type |
このパラメータは、変数ウィンドウの [名前] 列と [型] 列に影響があります (コンストラクタと同じ構文で、文字列に設定できます)。 このパラメータを乱用したり、不適切に使用したりすると、出力を混乱させる可能性があります。 |
Target, TargetTypeName |
属性がアセンブリ レベルで使用される場合に、対象の型を指定します。 |
メモ : |
---|
autoexp.cs ファイルは、DebuggerDisplay 属性をアセンブリ レベルで使用します。autoexp.cs ファイルは、Visual Studio が C# 変数に対して使用する既定の展開を指定します。DebuggerDisplay 属性の使用方法などについて autoexp.cs ファイルで確認したり、autoexp.cs ファイルを変更してコンパイルすることで既定の展開を変更したりできます。変更する場合は、その前に autoexp.cs ファイルのバックアップを作成してください。\Program Files\Microsoft Visual Studio 9.0\Common7\IDE\PublicAssemblies の Microsoft.VisualStudio.DebuggerVisualizers.dll の参照が必要です。autoexp.cs ファイルは、My Documents/Visual Studio 9.0/Visualizers にあります。 |
使用例
次のコード例では、DebuggerDisplay を DebuggerBrowseable および DebuggerTypeProxy と組み合わせて使用する方法を示します。[ウォッチ] ウィンドウなど、デバッガの変数ウィンドウに表示されると、次のように展開が作成されます。
名前 |
値 |
型 |
---|---|---|
キー |
"three" |
object {string} |
値 |
3 |
object {int} |
[DebuggerDisplay("{value}", Name = "{key}")]
internal class KeyValuePairs
{
private IDictionary dictionary;
private object key;
private object value;
public KeyValuePairs(IDictionary dictionary, object key, object value)
{
this.value = value;
this.key = key;
this.dictionary = dictionary;
}
public object Key
{
get { return key; }
set
{
object tempValue = dictionary[key];
dictionary.Remove(key);
key = value;
dictionary.Add(key, tempValue);
}
}
public object Value
{
get { return this.value; }
set
{
this.value = value;
dictionary[key] = this.value;
}
}
}
[DebuggerDisplay("Count = {hashtable.Count}")]
[DebuggerTypeProxy(typeof(HashtableDebugView))]
class MyHashtable
{
public Hashtable hashtable;
public MyHashtable()
{
hashtable = new Hashtable();
}
private class HashtableDebugView
{
private MyHashtable myhashtable;
public HashtableDebugView(MyHashtable myhashtable)
{
this.myhashtable = myhashtable;
}
[DebuggerBrowsable(DebuggerBrowsableState.RootHidden)]
public KeyValuePairs[] Keys
{
get
{
KeyValuePairs[] keys = new KeyValuePairs[myhashtable.hashtable.Count];
int i = 0;
foreach (object key in myhashtable.hashtable.Keys)
{
keys[i] = new KeyValuePairs(myhashtable.hashtable, key, myhashtable.hashtable[key]);
i++;
}
return keys;
}
}
}
}