C # -Debugging: [DebuggerDisplay] oder ToString ()?

90

Es gibt zwei Möglichkeiten, den Nutzen des Debuggens von Informationen zu erhöhen, anstatt sie {MyNamespace.MyProject.MyClass}im Debugger anzuzeigen.

Dies sind die Verwendung DebuggerDisplayAttributeund die ToString()Methode.

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 einen Grund, das eine dem anderen vorzuziehen? Gibt es einen Grund, nicht beides zu tun? Ist es eine rein persönliche Präferenz?

bwerks
quelle

Antworten:

93

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

Dies kann eine gute Sache sein oder auch nicht.

Oft möchten Sie beim Debuggen mehr Informationen als Ihre Standardausgabe ToString(). In diesem Fall würden Sie beide verwenden.

In Ihrem Fall erscheint mir beispielsweise die Implementierung von "ToString" seltsam. Ich würde erwarten, dass eine ToString () - Implementierung der Klasse "Person" nur den Namen direkt zurückgibt, nicht "Name = PersonsName". Während des Debuggens möchte ich jedoch möglicherweise diese zusätzlichen Informationen.

Reed Copsey
quelle
9
+1 Hinzufügen zu Reeds "Nebenwirkungspunkt": ToStringWird häufig als "Standardanzeigezeichenfolge" verwendet, z. B. durch Console.WriteLineoder WPF-Datenbindung.
Stephen Cleary
Sicher; Das Format der Zeichenfolge wurde nur als visuelles Beispiel angegeben, um die Ähnlichkeit mit der für DebuggerDisplay angegebenen Zeichenfolge hervorzuheben. Das DebuggerDisplay-Format kann den Namen auch direkt zurückgeben, wie Sie sagen. Ich verstehe Ihren Standpunkt zu Nebenwirkungen - es ist die Art von Unterscheidung, nach der ich suche. Normalerweise verwende ich die ToString-Methode nicht häufig für Klassen (mit Ausnahme des oben angegebenen Zwecks), sodass die anderen Verwendungen für mich nicht so offensichtlich waren. Vielen Dank!
bwerks
5

"Wenn Sie eine benutzerdefinierte Klasse oder Struktur erstellen, sollten Sie die ToString-Methode überschreiben, um dem Clientcode Informationen zu Ihrem Typ bereitzustellen." - MSDN

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

Piotr Perak
quelle
4

Die Langsamkeit des Debuggers kann ebenfalls berücksichtigt werden:

DebuggerDisplayAttributeDer Formatausdruck wird vom Debugger nach jedem Debugging-Schritt / Haltepunkt interpretiert .

ToStringwird in Ihrem Code kompiliert und ist daher vom Debugger viel schneller auszuführen.

Dies gilt auch für bedingte Haltepunkte: Wenn der bedingte Ausdruck zu langsam ist, um vom Debugger jedes Mal interpretiert zu werden, wenn die Ausführung den Haltepunkt erreicht, kann es nützlich sein, den Haltepunkt zu entfernen und stattdessen temporären Code wie folgt hinzuzufügen: if (condition) Debugger.Break();

Wizou
quelle