Pomocí atributu DebuggerDisplay
DebuggerDisplay Atributu (System.Diagnostics.DebuggerDisplayAttribute) řídí zobrazení třídy nebo pole v proměnné windows debugger.Tento atribut lze použít:
Třídy
Struktur
Delegáti
Výčty
Pole
Vlastnosti
Sestavení
DebuggerDisplay Atribut má jeden argument, což je řetězec zobrazený ve sloupci Hodnota pro instance typu.Tento řetězec může obsahovat závorky ({ a }).Text v rámci dvojici závorek bude vyhodnocen jako pole, vlastnost nebo metodu.
Pokud má objekt C# Potlačená ToString(), bude ladicí program vyřazení volání a zobrazit výsledek místo standardního {<typeName>}.Proto je přepsán ToString(), není nutné použít DebuggerDisplay.Používáte-li oba DebuggerDisplay atribut přednost 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 raw struktura objektů v proměnné windows políčko v Možnosti nástroje dialogové okno pak bude DebuggerDisplay atribut je ignorován. |
Následující tabulka ukazuje některé možná využití DebuggerDisplay příklad atributu a výstupy.
Atribut |
Výstup uvedené hodnotu 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] |
DebuggerDisplayMůžete také přijmout pojmenované parametry.
Parametry |
Účel |
---|---|
Name, Type |
Tyto parametry mají vliv název a typu sloupce proměnné systému windows.(Lze nastavit na řetězce použijte stejnou syntaxi jako konstruktor.)Tyto parametry overusing nebo jejich použití nesprávně, může způsobit matoucí výstup. |
Target, TargetTypeName |
Určuje typ cíle při použití atributu úrovni sestavení. |
[!POZNÁMKA]
V souboru autoexp.cs DebuggerDisplay atributu úrovni sestavení.Soubor autoexp.cs Určuje výchozí možnosti, které používá Visual Studio pro proměnné 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í možnosti.Nezapomeňte zálohovat soubor autoexp.cs před úpravami.Microsoft.VisualStudio.DebuggerVisualizers.dll musí odkazovat v 11.0\Common7\IDE\PublicAssemblies \Program Files\Microsoft Visual Studio.Soubor autoexp.cs můžete najít ve složce Studio 2012 dokumenty/Visual/Visualizers.
Použití výrazů v DebuggerDisplay
Můžete použít obecný výraz složené závorky v atributu DebuggerDisplay, tento postup se nedoporučuje.
Obecný výraz v DebuggerDisplay má implicitní přístup this pro aktuální instanci pouze typ cílové ukazatele.Výraz nemá přístup aliasy, locals nebo ukazatele.Pokud výraz odkazuje na vlastnosti, atributy na tyto vlastnosti nejsou zpracovány.Například kódu C# [DebuggerDisplay("Object {count - 2}" by zobrazil Object 6 -li pole count byla 8.
Použití výrazů v DebuggerDisplay může vést k následujícím problémům:
Výraz je vyhodnocen pokaždé, když je zobrazena vyhodnocování výrazů je nejnákladnější operace v debuggeru.To může způsobit problémy s výkonem v krokování kódu.Složený výraz, který slouží k zobrazení hodnot v kolekci nebo seznamu lze například velmi pomalý při je velký počet prvků.
Výrazy jsou vyhodnocovány podle vyhodnocení výrazu jazyka aktuální snímek zásobníku a není vyhodnocení jazyka, ve kterém byl zapsán výraz.To může způsobit neočekávané výsledky při různých jazyků.
Vyhodnocení výrazu můžete změnit stav aplikace.Například výraz, který nastaví vlastnost mutates hodnotu vlastnosti v provádění kódu.
Vytvořením soukromé vlastnosti, která provede operaci a vrátí řetězec je možné snížit možné problémy vyhodnocení výrazu.Atribut DebuggerDisplay pak lze zobrazit hodnoty soukromé vlastnosti.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é, jako sledovat okna, vyrábí 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
Pomocí atributu DebuggerTypeProxy