Debug
Na následujícím ukázkovém příkladě si ukážeme jednotlivé metody této třídy. Nejprve si vytvoříme třídu Osoba
public class Osoba
{
private string m_Jmeno;
private string m_Prijmeni;
public Osoba(string jmeno, string prijmeni)
{
m_Jmeno = jmeno;
m_Prijmeni = prijmeni;
}
public string Jmeno
{
get { return m_Jmeno; }
set { m_Jmeno = value; }
}
public string Prijmeni
{
get { return m_Prijmeni; }
set { m_Prijmeni = value; }
}
}
|
Na této třídě není zatím nic zvláštního. V metodě main vytvoříme novou instanci Osoby
Osoba novaOsoba = new Osoba("Ja", "3");
novaOsoba = null;
Debug.Assert(novaOsoba != null, "instance tridy Osoba je NULL");
instanci nastavíme schválně na null, aby jsme mohli využít první metodu ze třídy Debug, kterou je Assert. Tato metoda přijímá 2(3) parametry. Prvním parametrem je podmínka, která když nabyde hodnoty false, vyvolá se dialogové okno s naším popisem, který předáme jako druhý parametr. Třetí parametr je detailnější popis. Dialogové okno vypadá následovně
Po kliknutí na tlačítko Retry se přepneme do kódu a můžeme naší chybu rychle napravit. jestliže by jsme si ovšem nechtěli zobrazovat pořád podobná okna a vystačíme si jenom z výpisy, využijeme metody Write, WriteLine, které vypíší danou zprávu, či metody WriteIf, WriteLineIf, které také vypíši danou zprávu, ale už na základě dané podmínky
Osoba novaOsoba = new Osoba("Ja", "3");
Debug.Assert(novaOsoba != null, "instance tridy Osoba je NULL");
Debug.WriteLineIf(novaOsoba.Jmeno.Equals("Ja"), "jsem to opravdu Ja");
Pokud si zobrazíme okno Output, uvidíme v něm opravdu text "jsem to opravdu Ja"
Nyní se dostáváme k Debug atributům. Je jich celá řada, ale mě osobně nejvíce zaujali první tři:
- DebuggerBrowsableAttribute
- DebuggerDisplayAttribute
- DebuggerHiddenAttribute
- DebuggerNonUserCodeAttribute
- DebuggerStepperBoundaryAttribute
- DebuggerStepThroughAttribute
- DebuggerTypeProxyAttribute
- DebuggerVisualizerAttribute
Všechny atributy si ukážeme vždycky na příkladech před a po.
DebuggerBrowsableAttribute
| Před |
Po |
 |
|
Určitě jste si všimnuli změny a teď zůstává pouze otázkou jak se toho docílilo. Pokud máme ve tříde privátní proměnné a k ním odpovídající vlastnosti, je tedy nepotřebný aby jsme hodnoty měli zobrazené dvakrát, proto tedy využijeme DebuggerBrowsableAttribute
[DebuggerBrowsable(DebuggerBrowsableState.Never)]
private string m_Jmeno;
[DebuggerBrowsable(DebuggerBrowsableState.Never)]
private string m_Prijmeni;
Ovšem v takto triviální třídě by jsme ještě mohli chtít aby se nám místo {Osoba} zobrazilo přímo jméno a příjmené, něco ve smyslu Jmeno="Ja", Prijmeni="3". Využijeme tedy druhý v pořadí atribut s názvem DebuggerDisplayAttribute a naší třídu uprávíme takto
[DebuggerDisplay("Jmeno = {m_Jmeno}, Prijmeni = {m_Prijmeni}")]
public class Osoba
Nyní už nevidíme v hodnotě Value pouze {Osoba}, ale

Představme si, že krokujeme náš příklad a po vytvoření instance budeme chtít změnit příjmení, takže klasicky předáme naší vlastnosti Prijmeni novou hodnotu. Když si pak budeme krokovat kód tak po zmáčknutí F11 (krok vpřed), se dostaneme do vlastnosti, přesněji do části set, kde se provede nastavení. Chceme -li tot přeskočit, můžeme využít F10, který do vlastnosti nevstiupí a přeskočí jí. Ovšem stejné funkcionality můžeme dosáhnout i při krokování F11 a to využitím DebuggerHiddenAttributu
[DebuggerHidden()]
public Osoba(string jmeno, string prijmeni)
{
m_Jmeno = jmeno;
m_Prijmeni = prijmeni;
}
Tahle úprava konstruktoru zajistí, že při krokování nám Debugger nevkročí do konstruktoru, ale pokračuje dál. Pokud je naše aplikace hotová a release verze vydána tak všechny Debug a Debugger "značky" jsou ignorovány!!!
Trace
Tato třída je vhodná pro trasovací výpisy, které si můžeme nechat zobrazit ve standardním Output okně (DefaultTraceistener), uložit do textového souboru (TextWriterTraceListener), xml souboru (XmlWriterTraceListener), či EventLogu (EventLogTraceListener) Nastavení našeho trasování můžeme provést v kódu
Trace.Listeners.Clear();
TextWriterTraceListener text = new TextWriterTraceListener("trace.txt");
Trace.Listeners.Add(text);
Trace.AutoFlush = true;
nebo pro mě "hezčím" způsobem přímo v konfiguračním souboru
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.diagnostics>
<trace autoflush="true">
<listeners>
<add name="MujListener"
type="System.Diagnostics.TextWriterTraceListener"
initializeData="trace.txt"/>
<remove name="default"/>
</listeners>
</trace>
</system.diagnostics>
</configuration>
Jakmile v kódu zavoláme metodu Trace.WriteLine("zprava"), provede se její zápis do souboru trace.txt.