2010-07-06 17 views
61

Es gibt zwei Möglichkeiten, die Nützlichkeit von Debuginformationen zu erhöhen, anstatt {MyNamespace.MyProject.MyClass} im Debugger zu sehen.C# Debugging: [DebuggerDisplay] oder ToString()?

Dies sind die Methoden DebuggerDisplayAttribute und ToString().

using System.Diagnostics; 
... 

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

oder

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

Gibt es irgendeinen Grund einen zum anderen zu bevorzugen? Irgendein Grund, beides nicht zu tun? Ist es rein persönliche Vorliebe?

Antwort

69

Die Verwendung von [DebuggerDisplay] ist nur für den Debugger gedacht. Das Überschreiben von ToString() hat den "Nebeneffekt", die Anzeige zur Laufzeit zu ändern.

Dies kann oder darf nicht eine gute Sache sein.

Oft möchten Sie mehr Informationen während des Debuggens als Ihre Standardausgabe ToString(), in diesem Fall würden Sie beide verwenden.

Zum Beispiel scheint in Ihrem Fall die "ToString" Implementierung seltsam für mich. Ich würde erwarten, dass eine ToString() - Implementierung der "Person" -Klasse den Namen direkt zurückgibt, nicht "Name = PersonsName". Während des Debuggens möchte ich jedoch zusätzliche Informationen.

+7

+1 Hinzufügen zu Reed's "Nebeneffekt" Punkt: 'ToString' wird oft als" Standardanzeigezeichenfolge "verwendet, zB durch' Console.WriteLine' oder WPF Datenbindung. –

+0

Sicher; Das Format der Zeichenfolge wurde nur für ein visuelles Beispiel angegeben, um ihre Ähnlichkeit mit der für DebuggerDisplay angegebenen Zeichenfolge hervorzuheben. Das DebuggerDisplay-Format könnte auch den Namen direkt zurückgeben, wie Sie sagen. Ich sehe jedoch deine Meinung über Nebenwirkungen - es ist die Art von Unterscheidung, nach der ich suche. Ich verwende die ToString-Methode in der Regel nicht viel für Klassen (außer für den oben angegebenen Zweck), so dass meine anderen Nutzungen nicht so offensichtlich für mich waren. Vielen Dank! – bwerks

5

"Wenn Sie eine benutzerdefinierte Klasse oder Struktur erstellen, sollten Sie die ToString-Methode überschreiben, um dem Client-Code Informationen über Ihren Typ bereitzustellen." - MSDN

Wenn was ToString() zurückgibt und Sie im Debugger nicht sehen, was Sie möchten, dann verwenden Sie DebuggerDisplayAttribute.

0

Langsamkeit des Debuggers kann auch berücksichtigt werden:

DebuggerDisplayAttribute Formatausdruck ist vom Debugger nach jedem Schritt Debugging/Haltepunkt interpretiert.

ToString ist kompiliert in Ihrem Code und ist daher viel schneller durch den Debugger auszuführen.

Das ist das gleiche mit bedingten Haltepunkten ist: Wenn der bedingte Ausdruck zu langsam durch den Debugger jedesmal, wenn die Ausführung erreicht den Haltepunkt zu interpretieren, ist es sinnvoll sein kann, den Haltepunkt zu entfernen und stattdessen temporären Code wie folgt hinzu: if (condition) Debugger.Break();