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.
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.
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
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