Ukrywanie składowych klas w debugerze (DebuggerBrowsable)

Możliwości kształtowania wyglądu naszych klas dla łatwiejszego debuggowania są bardzo duże. Poprzednio pokazałem jak można wpływać  na to, co nam wyświetli debugger o naszej klasie (DebuggerDisplay) oraz jak można tworzyć własne wizualizery klas (Debugger Visualizers). Teraz czas na ukrywanie składowych (np. prywatnych) naszej klasy, aby nie zaśmiecać sobie podglądu stanu okiektu podczas sesji „odrobaczania”.

Po staremu

Załóżmy, że mamy klasę Address, która składa się z prywatnych i publicznych składowych:

public class Address
{
    // private fields
    private string _city;
    private string _street;
    private int _nr;

    // public properties
    public string City
    {
        get { return _city; }
        set { _city = value; }
    }
    public string Street
    {
        get { return _street; }
        set { _street = value; }
    }
    public int Nr
    {
        get { return _nr; }
        set { _nr = value; }
    }
}

Trzy pola i trzy właściwości. Gdy będziemy debugować taki obiekt, zobaczymy wszystkie składowe:

Jak widać składowe są posortowane alfabetycznie. W tym przypadku prywatne pola poprzedzone znakiem podkreślenia są na samej górze i wyświetlają dokładnie te same wartości, co odpowiadające im publiczne właściwości. Jeśli klasa będzie większa szybko się okaże, że mamy za mały ekran aby lista składowych mogła się zmieścić. Wprowadźmy małą modyfikację do klasy Address.

DebuggerBrowseable

Atrybut DebuggerBrowseable jest dostępny w przestrzeni System.Diagnostics. Możemy go stosować nad polami i właściwościami. Posiada jeden parametr (enum, typu DebuggerBrowseableState), który steruje sposobem wyświetlania danej składowej. Na początek interesuje nas ukrywanie czyli DebuggerBrowseableState.Never:

public class Address
{
    // private fields
    [DebuggerBrowsable(DebuggerBrowsableState.Never)]
    private string _city;
    [DebuggerBrowsable(DebuggerBrowsableState.Never)]
    private string _street;
    [DebuggerBrowsable(DebuggerBrowsableState.Never)]
    private int _nr;

Teraz gdy sprawdzimy w debuggerze obiekt typu Address, nie zobaczymy więcej niepotrzebnych składowych.

Oczywiście atrybut DebuggerBrowseable można stosować również na właściwościach (prywatnych i publicznych).

Show Raw structure

Przy okazji ukrywania składowych warto wiedzieć, że w opcjach Visual Studio możemy ustawić aby zawsze wyświetlać wszystkie składowe. Przydaje się to na wypadek, jeśli my lub inny programista dla własnej wygody ukrył jakieś składowe, a nam zależy aby je zobaczyć.

Wystarczy z menu Tool -> Options -> Debugging -> General -> włączyć opcję: Show raw structure of objects in variables windows.

Advertisements

3 thoughts on “Ukrywanie składowych klas w debugerze (DebuggerBrowsable)

  1. Pingback: dotnetomaniak.pl

  2. Używasz tych atrybutów w kodzie produkcyjnym ? Czy tylko czasem jako pomoc w debuggowaniu?

    • To zależy 🙂
      DebuggerBrowsable – prawie w ogóle nie używam, chyba, że mam duużą klasę i duużo pół opakowanych we właściwości – wtedy jest to bardziej czytelne.
      DebuggerDisplay – często gęsto, bo bardzo ułatwia życie
      DebuggerVisualizer – 1 raz dla testów i zabawy

      Jeśli używam atrybutów Debugger’a to zarówno w debugu i w produkcji (chyba, że dany kawałek kodu jest krytyczny i wymaga maksymalnej wydajności)

      W kolejnych postach postaram się pokazać jak można rozdzielić kod debuggera od produkcyjnego.

Możliwość komentowania jest wyłączona.