Verwenden des DebuggerDisplay-Attributs
Aktualisiert: November 2007
Dieses Thema gilt für folgende Anwendungsbereiche:
Edition |
Visual Basic |
C# |
C++ |
Web Developer |
---|---|---|---|---|
Express |
||||
Standard |
||||
Pro und Team |
Tabellenlegende:
Vorhanden |
|
Nicht vorhanden |
|
Befehl oder Befehle, die standardmäßig ausgeblendet sind. |
Das DebuggerDisplay-Attribut (System.Diagnostics.DebuggerDisplayAttribute) steuert die Anzeige einer Klasse oder eines Felds in den Debuggervariablenfenstern. Mögliche Zuweisungen dieses Attributs:
Klassen
Strukturen
Delegaten
Enumerationen
Felder
Eigenschaften
Assemblys
Das DebuggerDisplay-Attribut verfügt über ein einziges Argument, das als Zeichenfolge in der Spalte Wert für Instanzen des Typs angezeigt wird Diese Zeichenfolge kann Klammern ({ und }) enthalten. Text innerhalb eines Paares geschweifter Klammern wird als ein Feld, eine Eigenschaft oder eine Methode ausgewertet.
In C#-Code können Sie zwischen den Klammern einen allgemeinen Ausdruck verwenden. Der Ausdruck hat ausschließlich für die aktuelle Instanz des Zieltyps impliziten Zugriff auf den this-Zeiger. Der Ausdruck hat keinen Zugriff auf Aliase, lokale Variablen oder Zeiger. Wenn der Ausdruck auf Eigenschaften verweist, werden deren Attribute nicht verarbeitet.
Wenn bei einem C#-Objekt ToString() überschrieben wurde, ruft der Debugger die Überschreibung auf und zeigt deren Ergebnisse anstelle des Standardwerts {<typeName>} an. Wenn Sie also ToString() überschrieben haben, müssen Sie DebuggerDisplay nicht verwenden. Wenn Sie beides verwenden, hat das DebuggerDisplay-Attribut Vorrang gegenüber der ToString()-Überschreibung.
Ob der Debugger diesen impliziten ToString() -Aufruf auswertet, hängt von einer Benutzereinstellung im Dialogfeld Optionen ab (Kategorie Debuggen, Seite Allgemein). Visual Basic implementiert diese implizite ToString()-Auswertung nicht.
In der folgenden Tabelle werden einige Verwendungsmöglichkeiten des DebuggerDisplay-Attributs sowie Beispielausgaben gezeigt.
Attribut |
Ausgabe (angezeigt in der Spalte Wert) |
---|---|
[DebuggerDisplay("x = {x} y = {y}")] Angewendet auf einen Typ mit den Feldern x und y. |
x = 5 y = 18 |
[DebuggerDisplay("String value is {getString()}")] Die Parametersyntax kann je nach Sprache unterschiedlich sein. Achten Sie deshalb besonders auf die Syntax. |
String value is [5, 6, 6] |
[DebuggerDisplay("Object {count - 2}: {(flag) ? \"yes\" : \"no\"}")] Die Ausdruckssyntax ist je nach Sprache verschieden. Achten Sie deshalb besonders auf die Syntax. |
Object 6: yes |
[DebuggerDisplay("Last = {_lastName,nq} {_var == null ? \"\" : \"First = \" + _firstName,nq}")] ,nq entfernt die Anführungszeichen. |
Wenn der Nachname vorhanden ist Last = lastname First = firstname andernfalls: Last = lastname |
DebuggerDisplay kann auch benannte Parameter akzeptieren.
Parameter |
Zweck |
---|---|
Name, Type |
Diese Parameter beeinflussen die Spalte Name und die Spalte Typ der Variablenfenster. (Sie können mit derselben Syntax wie der Konstruktor auf Zeichenfolgen festgelegt werden.) Der übermäßige Gebrauch dieser Parameter oder ihr falscher Einsatz kann zu verwirrenden Ausgaben führen. |
Target, TargetTypeName |
Gibt den Zieltyp an, wenn das Attribut auf Assemblyebene verwendet wird. |
Hinweis: |
---|
Die Datei autoexp.cs verwendet das DebuggerDisplay-Attribut auf Assemblyebene. Die Datei autoexp.cs bestimmt die Standarderweiterungen, die Visual Studio für C#-Variablen verwendet. Suchen Sie in der Datei autoexp.cs entweder Beispiele zur Verwendung des DebuggerDisplay-Attributs, oder bearbeiten und kompilieren Sie die Datei autoexp.cs, um die Standarderweiterungen zu ändern. Erstellen Sie eine Sicherungskopie der Datei autoexp.cs, bevor Sie sie ändern. Sie müssen einen Verweis auf die Datei Microsoft.VisualStudio.DebuggerVisualizers.dll in \Programme\Microsoft Visual Studio 9.0\Common7\IDE\PublicAssemblies hinzufügen. Die Datei autoexp.cs finden Sie unter Eigene Dateien/Visual Studio 9.0/Visualizers. |
Beispiel
Im folgenden Codebeispiel wird veranschaulicht, wie DebuggerDisplay zusammen mit DebuggerBrowseable und DebuggerTypeProxy verwendet wird. Bei der Anzeige in einem Debuggervariablenfenster (z. B. im Fenster Überwachen) wird dadurch eine Erweiterung produziert, die folgendermaßen aussieht:
Name |
Wert |
Typ |
---|---|---|
Schlüssel |
"three" |
object {string} |
Wert |
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;
}
}
}
}
Siehe auch
Konzepte
Anzeigen von benutzerdefinierten Datentypen
Verbessern des Debuggens mit den Debuggeranzeigeattributen