Debug C #: [DebuggerDisplay] o ToString ()?


92

Esistono due modi per aumentare l'utilità delle informazioni di debug invece di vederle {MyNamespace.MyProject.MyClass}nel debugger.

Questi sono l'uso DebuggerDisplayAttributee il ToString()metodo.

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 motivo per non fare entrambe le cose? È una preferenza puramente personale?

Risposte:


94

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

Questo può essere o meno una buona cosa.

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

Ad esempio, nel tuo caso, l'implementazione "ToString" mi sembra strana. Mi aspetto che un'implementazione ToString () della classe "Person" restituisca direttamente il nome, non "Name = PersonsName". Tuttavia, durante il debug, potrei volere queste informazioni extra.


9
+1 Per aggiungere al punto "effetto collaterale" di Reed: ToStringviene spesso utilizzato come "stringa di visualizzazione predefinita", ad esempio da Console.WriteLineo dal data binding WPF.
Stephen Cleary

Sicuro; il formato della stringa è stato fornito solo per un esempio visivo per enfatizzare la sua somiglianza con la stringa data per DebuggerDisplay. Il formato DebuggerDisplay potrebbe anche restituire direttamente il nome, come dici tu. Capisco però il tuo punto di vista sugli effetti collaterali: è il tipo di distinzione che sto cercando. In genere non utilizzo molto il metodo ToString sulle classi (eccetto per lo scopo che ho indicato sopra), quindi i suoi altri usi non erano così evidenti per me. Grazie!
bwerks

5

"Quando crei una classe o una struttura personalizzata, devi sovrascrivere il metodo ToString per fornire informazioni sul tuo tipo al codice client." - MSDN

Se ciò che ToString()ritorna e vedi nel debugger non è quello che vorresti, allora lo usi DebuggerDisplayAttribute.


4

La lentezza del debugger può anche essere presa in considerazione:

DebuggerDisplayAttributel'espressione di formato viene interpretata dal debugger dopo ogni passaggio / punto di interruzione del debug.

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

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.