Používání atributu DebuggerDisplay
DebuggerDisplay Atribut (System.Diagnostics.DebuggerDisplayAttribute) ovlivňuje způsob zobrazení třídy nebo pole v oknech ladicí program proměnné.Tento atribut lze použít pro:
Třídy
Struktur
Delegáti
Výčty
Pole
Vlastnosti
Sestavení
DebuggerDisplay Má jediný argument, který je řetězec, který má být zobrazen ve sloupci Hodnota pro atribut typu instance.Tento řetězec může obsahovat závorky ({ a }).Text v páru složených závorek se vyhodnotí jako pole, vlastnost nebo metodu.
Pokud má objekt C# překryté ToString(), ladicí program bude volat přepsání a zobrazit výsledek namísto standardní {<typeName>}.Tedy pokud je přepsána ToString(), není nutné používat DebuggerDisplay.Pokud použijete oba DebuggerDisplay atribut má přednost před ToString() přepsat.
Zda ladicí program vyhodnotí tomto implicitní ToString() volání závisí na nastavení uživatele v Možnosti dialogové okno (ladění kategorie Obecné stránky).Visual Basic neimplementuje tomto implicitní ToString() hodnocení.
Důležité |
---|
Pokud Zobrazit raw strukturu objektů v proměnné systému windows zaškrtnuto políčko v Nástroje-možnosti- dialogové okno, pak bude DebuggerDisplay atribut je ignorován. |
Následující tabulce jsou uvedeny některé možné použití DebuggerDisplay příklad atributu a výstupy.
Atribut |
Výstup uvedené v hodnoty sloupce) |
---|---|
[DebuggerDisplay("x = {x} y = {y}")] Použít u polí typu x a y. |
x = 5 y = 18 |
[DebuggerDisplay("String value is {getString()}")]Syntaxe parametru se mohou lišit mezi jazyky.Proto ji používejte opatrně. |
String value is [5, 6, 6] |
DebuggerDisplaypojmenované parametry lze také přijímat.
Parametry |
Účel |
---|---|
Name, Type |
Tyto parametry mají vliv jméno a typu sloupce proměnné systému windows. (Které lze nastavit jako konstruktor pomocí stejné syntaxe řetězce.)Nadměrnému používání těchto tyto parametry a jejich použití nesprávně, může způsobit matoucí výstup. |
Target, TargetTypeName |
Určuje typ cíle při použití atributu na úrovni sestavení. |
[!POZNÁMKA]
Používá soubor autoexp.cs DebuggerDisplay atributu na úrovni sestavení.Soubor autoexp.cs Určuje výchozí rozšíření, které aplikace Visual Studio používá pro proměnné v jazyce C#.Příklady použití souboru autoexp.cs můžete zkontrolovat DebuggerDisplay atribut, nebo můžete upravit a zkompilujte soubor autoexp.cs Chcete-li změnit výchozí rozšíření.Nezapomeňte zálohovat soubor autoexp.cs před úpravami.Microsoft.VisualStudio.DebuggerVisualizers.dll musí být uveden v \Program Files\Microsoft Visual Studio 12.0\Common7\IDE\PublicAssemblies.Soubor autoexp.cs můžete najít v složce Dokumenty/Visual Studio 2012/Visualizers.
Použití výrazů v DebuggerDisplay
Přestože lze použít obecný výraz mezi složenými závorkami v atributu DebuggerDisplay, tento postup se nedoporučuje.
Obecný výraz v DebuggerDisplay má implicitní přístup k this ukazatel aktuální instance typ cílového.Výraz nemá přístup k aliasy, lokální nebo ukazatele.Pokud výraz odkazuje na vlastnosti, atributy na tyto vlastnosti nejsou zpracovány.Například kód jazyka C# [DebuggerDisplay("Object {count - 2}" by se zobrazila, Object 6 -li pole count byl 8.
Použití výrazů v DebuggerDisplay může vést k následujícím problémům:
Vyhodnocování výrazů je nejnákladnější operace v ladicím programu a tento výraz je vyhodnocován při každém jejím zobrazení.To může způsobit problémy s výkonem v krokování kódu.Složitý výraz, který slouží k zobrazení hodnot v kolekci nebo seznamu lze například velmi pomalé při velký počet prvků.
Výrazy jsou vyhodnocovány podle vyhodnocení výrazu jazyka aktuálního snímku zásobníku a není vyhodnocení jazyka, ve kterém byl napsán výraz.Po různých jazyků, může vést k nepředvídatelným výsledkům.
Vyhodnocení výrazu můžete změnit stav aplikace.Například výraz, který nastaví hodnotu vlastnosti mutuje hodnotu vlastnosti v provádění kódu.
Jedním způsobem, jak snížit možné problémy vyhodnocení výrazu je vytvoření soukromé vlastnosti, který provede operaci a vrátí hodnotu typu string.Atribut DebuggerDisplay pak lze zobrazit hodnotu této vlastnosti soukromé.Následující příklad implementuje tento vzor:
[DebuggerDisplay("{DebuggerDisplay,nq}")]public sealed class MyClass { public int count { get; set; } public bool flag { get; set; } private string DebuggerDisplay { get{ return string.Format("("Object {0}", count - 2); } }}
Příklad
Následující příklad kódu ukazuje, jak použít DebuggerDisplay, společně s DebuggerBrowseable a DebuggerTypeProxy.Při zobrazení v okně debugger proměnných, jako Sledování okno, vytváří rozšíření, která vypadá takto:
Název |
Value |
Type |
---|---|---|
Klíč |
"tři" |
objekt {řetězec} |
Value |
3 |
objekt {int} |
[DebuggerDisplay("{value}", Name = "{key}")]
internal class KeyValuePairs
{
private IDictionary dictionary;
private object key;
private object value;
public KeyValuePairs(IDictionary dictionary, object key, object value)
{
this.value = value;
this.key = key;
this.dictionary = dictionary;
}
public object Key
{
get { return key; }
set
{
object tempValue = dictionary[key];
dictionary.Remove(key);
key = value;
dictionary.Add(key, tempValue);
}
}
public object Value
{
get { return this.value; }
set
{
this.value = value;
dictionary[key] = this.value;
}
}
}
[DebuggerDisplay("{DebuggerDisplay,nq}")]
[DebuggerTypeProxy(typeof(HashtableDebugView))]
class MyHashtable
{
public Hashtable hashtable;
public MyHashtable()
{
hashtable = new Hashtable();
} private string DebuggerDisplay { get { return "Count = " + hashtable.Count); } }
private class HashtableDebugView
{
private MyHashtable myhashtable;
public HashtableDebugView(MyHashtable myhashtable)
{
this.myhashtable = myhashtable;
}
[DebuggerBrowsable(DebuggerBrowsableState.RootHidden)]
public KeyValuePairs[] Keys
{
get
{
KeyValuePairs[] keys = new KeyValuePairs[myhashtable.hashtable.Count];
int i = 0;
foreach (object key in myhashtable.hashtable.Keys)
{
keys[i] = new KeyValuePairs(myhashtable.hashtable, key, myhashtable.hashtable[key]);
i++;
}
return keys;
}
}
}
}
Viz také
Referenční dokumentace
Používání atributu DebuggerTypeProxy
Koncepty
Zobrazování vlastních datových typů
Rozšíření ladění pomocí atributů zobrazení ladicího programu