Sdílet prostřednictvím


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á poznámkaDů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

Koncepty

Zobrazení vlastní datové typy

Vylepšení zobrazení atributů Debugger ladění