Quick Tipp: Formatierung mit DebuggerDisplay

Quick Tipp: Formatierung mit DebuggerDisplay

Es ist ein leidiges Entwicklerproblem in Visual Studio: Ich möchte mir beim Debuggen den Inhalt eines Objekts anzeigen lassen, bekomme im Watch standardmäßig aber nur die Typbenamung angezeigt. Als Beispiel sei folgende Klasse gegeben:

public class Employee
{
    public int Id { get; set; }
    public string FirstName { get; set; }
   
public string LastName { get; set; }
   
public string Title { get; set; }
}

Für eine Instanz der Klasse in einer Liste zeigt der Debugger dann nur den Typnamen an:

Normal debugger object output

Problematisch ist das, wenn man eine lange Liste von Objekten hat und nun ein Element mit einer bestimmten Eigenschaft sucht. Dann könnte man die Instanzen alle nacheinander aufklappen, wirklich praktikabel ist ein solches „Brute Force Debugging“ allerdings nicht.

Eine Möglichkeit wäre die ToString()-Methode zu überladen, was die gewünschte Ausgabe erzeugt. Allerdings ist es aus meiner Sicht ein deutliches Anti-Pattern, ToString() nur für das Debugging zu überladen – schließlich könnte es auch für andere Zwecke verwendet werden. Sehr viel eleganter und auf den Use Case „Debugging“ beschränkt ist die Nutzung des DebuggerDisplay-Attributs (MSDN). Dieses lässt sich sowohl auf Klassen- als auch auf Property-Ebene definieren und erlaubt die dynamische Ausgabe von Klassen-Membern:

[DebuggerDisplay(„{Id}: {FirstName} {LastName}, {Title}“)]
public class Employee
{
    public int Id { get; set; }
    public string FirstName { get; set; }
   
public string LastName { get; set; }
   
public string Title { get; set; }
}

Die auszugebenden Member werden in einer Art Template innerhalb von geschweiften Klammern {} angegeben und zur Laufzeit vom Debugger ausgewertet, was eine schöne und vor allem nützliche Ausgabe erzeugt:

Output with DebuggerDisplay attribute

In den geschweiften Klammern besteht immer eine Referenz auf den this-Pointer der Klasse, womit auf deren Member (Eigenschaften, Felder, Methoden, …) zugegriffen werden kann. Es lassen sich auch beliebige Ausdrücke (mit Ausnahme von Lambda-Ausdrücken) angeben, z.B. mathematische Berechnungen. Dies ist aber in den allermeisten Fällen nicht sinnvoll und sollte daher vermieden werden.

Btw: Ist einer der Ausdrücke in der DebuggerDisplay-Definition ungültig, wird als Fallback wieder der Typname des Objekts im Debugger angezeigt.

Ich bin freiberuflicher Senior C#/.NET Softwareentwickler im Raum Frankfurt/Main. Mit Leidenschaft für Software-Design, Clean Code und moderne Technologien in den Bereichen Web, Win und Mobile.

0 Kommentare

Eine Antwort hinterlassen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

*