Sdílet prostřednictvím


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