Utilizzo dell'attributo DebuggerDisplay

Aggiornamento: novembre 2007

Le informazioni contenute in questo argomento sono valide per:

Edition

Visual Basic

C#

C++

Web Developer

Express

Argomento applicabile Argomento applicabile Argomento applicabile Argomento applicabile

Standard

Argomento applicabile

Argomento applicabile

Argomento applicabile

Argomento applicabile

Pro e Team

Argomento applicabile

Argomento applicabile

Argomento applicabile

Argomento applicabile

Legenda tabella:

Argomento applicabile

Applicabile

Argomento non applicabile

Non applicabile

Argomento valido ma comando nascosto per impostazione predefinita

Comando o comandi nascosti per impostazione predefinita.

L'attributo DebuggerDisplay (System.Diagnostics.DebuggerDisplayAttribute) controlla la modalità di visualizzazione di una classe o di un campo nelle finestre delle variabili del debugger. Questo attributo può essere applicato a:

  • Classi

  • Strutture

  • Delegati

  • Enumerazioni

  • Campi

  • Proprietà

  • Assembly

L'attributo DebuggerDisplay presenta un solo argomento, costituito da una stringa da visualizzare nella colonna Valore per le istanze del tipo. Questa stringa può contenere parentesi graffe ({ e }). Il testo racchiuso tra due parentesi graffe verrà valutato come un campo, una proprietà o un metodo.

In codice C# è possibile utilizzare un'espressione generale tra le parentesi graffe. L'espressione ha accesso implicito al puntatore this solo per l'istanza corrente del tipo di destinazione. L'espressione non ha accesso ad alias, variabili locali o puntatori. Se l'espressione fa riferimento a proprietà, gli attributi su tali proprietà non vengono elaborati.

Se un oggetto C# ha un metodo ToString() sottoposto a override, il debugger chiamerà l'override e ne visualizzerà il risultato, anziché chiamare il metodo {<typeName>} standard. Pertanto, se si è eseguito l'override del metodo ToString(), non è necessario utilizzare l'attributo DebuggerDisplay. Se si utilizzano entrambi, l'attributo DebuggerDisplay ha la precedenza sull'override di ToString().

La valutazione da parte del debugger di questa chiamata implicita a ToString() dipende da un'impostazione utente nella finestra di dialogo Opzioni (categoria Debug, pagina Generale). In Visual Basic questa valutazione implicita di ToString() non è implementata.

Nella tabella riportata di seguito vengono visualizzati alcuni utilizzi possibili dell'attributo DebuggerDisplay e alcuni output di esempio.

Attributo

Output visualizzato nella colonna Valore

[DebuggerDisplay("x = {x} y = {y}")]

Utilizzato in un tipo con campi x e y.

x = 5 y = 18

[DebuggerDisplay("String value is {getString()}")]

La sintassi del parametro può variare a seconda del linguaggio. Prestare, pertanto, particolare attenzione.

String value is [5, 6, 6]

[DebuggerDisplay("Object {count - 2}: {(flag) ? \"yes\" : \"no\"}")]

La sintassi dell'espressione varia a seconda del linguaggio. Prestare, pertanto, particolare attenzione.

Object 6: yes

[DebuggerDisplay("Last = {_lastName,nq} {_var == null ? \"\" : \"First = \" + _firstName,nq}")]

,nq consente di eliminare le virgolette.

Se è presente il cognome:

Last = lastname First = firstname

In caso contrario:

Last = lastname

DebuggerDisplay può anche accettare parametri denominati.

Parametri

Funzione

Name, Type

Questi parametri influiscono sulle colonne Nome e Tipo delle finestre delle variabili. Possono essere impostati su stringhe con la stessa sintassi del costruttore.

L'utilizzo eccessivo o improprio di questi parametri può generare confusione nell'output.

Target, TargetTypeName

Specifica il tipo di destinazione quando l'attributo viene utilizzato a livello di assembly.

Nota:

Il file autoexp.cs utilizza l'attributo DebuggerDisplay a livello di assembly. Il file autoexp.cs determina le espansioni predefinite utilizzate da Visual Studio per le variabili C#. È possibile esaminare il file autoexp.cs per esempi di utilizzo dell'attributo DebuggerDisplay o è possibile modificare e compilare il file autoexp.cs per modificare le espansioni predefinite. Assicurarsi di eseguire un backup del file autoexp.cs prima di modificarlo. Fare riferimento a Microsoft.VisualStudio.DebuggerVisualizers.dll in \Programmi\Microsoft Visual Studio 9.0\Common7\IDE\PublicAssemblies. È possibile trovare il file autoexp.cs in Documenti/Visual Studio 9.0/Visualizers.

Esempio

Nell'esempio di codice seguente viene illustrato l'utilizzo di DebuggerDisplay, insieme a DebuggerBrowseable e DebuggerTypeProxy. Quando visualizzato in una finestra delle variabili del debugger, come la finestra Espressioni di controllo, produce un'espansione analoga alla seguente:

Nome

Valore

Tipo

Chiave

"tre"

oggetto {string}

Valore

3

oggetto {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;
            }
        }
    }
}

Vedere anche

Concetti

Visualizzazione di tipi di dati personalizzati

Miglioramento del debug tramite gli attributi di visualizzazione del debugger

Riferimenti

Utilizzo dell'attributo DebuggerTypeProxy