2010-07-06 15 views
61

Esistono due modi per aumentare l'utilità delle informazioni di debug invece di vedere {MyNamespace.MyProject.MyClass} nel debugger.C# debugging: [DebuggerDisplay] o ToString()?

Questi sono l'uso del metodo DebuggerDisplayAttribute e ToString().

using System.Diagnostics; 
... 

[DebuggerDisplay("Name = {Name}")] 
public class Person 
{ 
    public string Name; 
} 

o

public class Person 
{ 
    public string Name; 
    public override string ToString() 
    { 
     return string.Format("Name = {0}", Name); 
    } 
} 

C'è qualche motivo per preferire l'uno all'altro? Qualche ragione per non fare entrambe le cose? È una preferenza puramente personale?

risposta

69

L'utilizzo di [DebuggerDisplay] è inteso solo per il debugger. L'override di ToString() ha l'effetto collaterale di cambiare la visualizzazione in fase di esecuzione.

Questo può o non può essere una buona cosa.

Spesso, durante il debug si desiderano più informazioni rispetto all'output standard ToString(), nel qual caso si utilizzeranno entrambi.

Ad esempio, nel tuo caso, l'implementazione di "ToString" mi sembra strana. Mi aspetterei che un'implementazione ToString() della classe "Persona" restituisca semplicemente il nome direttamente, non "Nome = Identità persone". Tuttavia, durante il debug, potrei volere quelle informazioni extra.

+7

+1 Per aggiungere al punto "effetto collaterale" di Reed: 'ToString' è spesso usato come" stringa di visualizzazione predefinita ", ad es. Per associazione di dati" Console.WriteLine' o WPF. –

+0

Sicuro; il formato della stringa è stato appena dato per un esempio visivo per enfatizzare la sua somiglianza con la stringa data per DebuggerDisplay. Il formato di DebuggerDisplay potrebbe anche restituire il nome direttamente, come dici tu. Vedo il tuo punto sugli effetti collaterali però - è il tipo di distinzione che sto cercando. Generalmente non utilizzo il metodo ToString su classi molto (tranne per lo scopo che ho dato sopra), quindi i suoi altri usi non erano così evidenti per me. Grazie! – bwerks

5

"Quando si crea una classe o una struttura personalizzata, è necessario eseguire l'override del metodo ToString per fornire informazioni sul tipo al codice client." - MSDN

Se ToString() ritorna e si vede nel debugger non è quello che si desidera utilizzare allora DebuggerDisplayAttribute.

0

lentezza del debugger può anche essere presa in considerazione:

DebuggerDisplayAttribute espressione formato è interpretato dal debugger dopo ogni passaggio debugging/breakpoint.

ToString è compilato nel codice ed è quindi molto più veloce da eseguire dal debugger.

Questo è lo stesso con i punti di interruzione condizionali: se l'espressione condizionale è troppo lento per interpretare dal debugger ogni volta che l'esecuzione raggiunge il punto di interruzione, può essere utile per rimuovere il punto di interruzione e invece aggiungere il codice temporaneo in questo modo: if (condition) Debugger.Break();

Problemi correlati