Freigeben über


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

Referenz

Verwenden des DebuggerTypeProxy-Attributs