DebuggerDisplayAttribute : object inspection durante il debug

Durante una sessione di debug, Visual Studio ci offre la possibilità di ispezionare lo stato di un oggetto visualizzando i valori che assumono i campi e le proprietà dell’oggetto stesso. Quando una classe è molto complessa, però, è tedioso analizzarne singolarmente tutti i membri per valutare se lo stato dell’oggetto è coerente con le nostre attese. Visual Studio ci offre una feature che possiamo sfruttare per ovviare a questo inconveniente.

Comportamento base Object.ToString()

Consideriamo una banalissima classe Person …

class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

… ed un’applicazione che istanzia un oggetto di questa classe e lo utilizza in qualche modo.

static void Main(string[] args)
{
    Person person = new Person() { FirstName = "Paolo", LastName = "Patierno" };
    ...
    ...
    ...
    Console.ReadLine();
}

Se eseguiamo l’applicazione in modalità debug e ci posizioniamo con il puntatore del mouse sull’oggetto person, Visual Studio visualizzerà la seguente informazione.

0508.dd_1_5DC33464

Esso rappresenta il nome della classe (nella forma <Namespace>.<Class>) di cui l’oggetto ne è un’istanza. Come si riesce ad ottenere questo comportamento ?

Ebbene, Visual Studio non fa nient’altro che eseguire il metodo ToString(), che come sappiamo fa parte della classe Object che è base di tutte le altre classi. Se una classe, non esegue l’override di questo metodo, il suo comportamento base è quello di visualizzare il nome della classe stessa.

Override del metodo ToString()

E’ possibile quindi sfruttare questa potenzialità eseguendo l’override del metodo ToString()nella classe Person per far visualizzare in debugging una sorta di summary informativo dello stato dell’oggetto.

public override string ToString()
{
    return String.Format("FirstName = {0}, LastName = {1}", this.FirstName, this.LastName);
}

Eseguendo nuovamente l’applicazione, l’output sulla variabile person sarà il seguente.

3683.dd_2_5C126890

In questo modo, abbiamo sott’occhio lo stato complessivo dell’oggetto (o almeno le informazioni che più ci interessano).

L’attributo DebuggerDisplay

Dal .Net Framework 3.5 è stato introdotto l’attributo DebuggerDisplayAttribute (nel namespace System.Diagnostics) da applicare ad una classe, che ci permette di ottenere il medesimo risultato senza la necessità di eseguire l’override del metodo ToString().

[DebuggerDisplay("FirstName = {FirstName}, LastName = {LastName}")]
class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

Esso prevede una stringa in ingresso che definisce la formattazione delle informazioni che vogliamo visualizzare (in maniera del tutto simile al String.Format() utilizzato precedentemente all’interno del metodo ToString()). Attraverso una sintassi del tipo{identificatore} è possibile accedere ad un campo, proprietà o addirittura un metodo della classe stessa.

Nel nostro caso, il risultato sarà del tutto analogo al precedente

2337.dd_2_507CAB51

Se avessimo addirittura un metodo che esegue una computazione e ritorna un valore, Visual Studio lo eseguirebbe in fase di debug visualizzandoci il risultato.

[DebuggerDisplay("FirstName = {FirstName}, LastName = {LastName}, Computation = {SomeMethod()}")]
class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }

    public override string ToString()
    {
        return String.Format("FirstName = {0}, LastName = {1}", this.FirstName, this.LastName);
    }

    public int SomeMethod()
    {
        int result;
        ...
        ...
        return result;
    }
}

Ottenendo il seguente risultato

0844.dd_3_020818E7

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s