Zobrazení informací o objektu při debugování – atribut DebuggerDisplay


Základní chování

Při debugování je občas nutné podívat se například do kolekce a zkoumat konkrétní objekt. Problém je ale tento konkrétní objekt najít. Předvedu na úplně jednoduchém příkladu. Mám kolekci lidí a hledám člověka s příjmením “Veith”, jenže vidím pouze toto:

image

Po rozbalení informací o objektu zjistím, že tento objekt to není a můžu pokračovat na další a možná dál a dál. V tomto případě by to problém nebyl, ale pokud by těch objektů bylo více, mohlo by to trvat dlouho a být to velice nepohodlné. Naštěstí ale existují možnosti, jak se tohoto zdržování zbavit.

Překrytí metody ToString()

Jednou z možností je překrýt metodu ToString(). Metodu ToString() defaultně používá VS při zobrazování informace o objektu, takže na obrázku vidíme kompletní název třídy. Na ukázku jsem tedy vytvořil další verzi třídy People (ze které dědí), tentokrát s překrytou metodou ToString(). Výsledkem je to, co jsme chtěli – relativně rychle a snadno najdeme požadovaný objekt:

image

Má to ale nevýhodu – co když zobrazovaná informace nemůže být stejná jako hodnota vracená metodou ToString()? Přeci jenom, metoda ToString() rozhodně nemá sloužit k tomu, aby při debugování byly vidět požadované hodnoty. Její použití pro tento účel tedy není ideální.

Správné řešení – použití atributu DebuggerDisplay

K vyřešení naznačeného problému nabízí .NET elegantní řešení – atribut DebuggerDisplay z namespacu System.Diagnostics. Tímto atributem stačí dekorovat třídu, nastavit jaké informace chceme zobrazovat a výsledek je vidět na obrázku pod ukázkovým kódem:

[System.Diagnostics.DebuggerDisplay
    (
        "FirstName={FirstName}, LastName={LastName}"
    )]
class PeopleWithDebuggerDisplay : People
{ ... }

image

Z kódu je jasné, jak se vybírají informace, které chceme zobrazit (zapisuje se do složených závorek) – v tomto případě jsou to vlastnosti FirstName a LastName. Zobrazit je možné libovolné vlastnosti v libovolném formátu (v příkladu jsou i popisky vlastností – “FirstName=…”).

Důležité také je, že tento atribut ovlivňuje pouze to, jak se budou zobrazovat instance této třídy při debugování.

, , ,

  1. #1 jkh 28.2.2012 - 20:05

    tohle se mi líbilo.díky

Komentáře jsou uzavřeny.