Udostępnij za pośrednictwem


Korzystanie z atrybutu DebuggerDisplay

DebuggerDisplay Atrybutu (System.Diagnostics.DebuggerDisplayAttribute) steruje sposobem wyświetlania klasy lub pola w zmiennej okna debugera.Ten atrybut może być stosowany do:

  • Klasy

  • Strukturach

  • Obiekty delegowane

  • Teksty stałe

  • Pola

  • Właściwości

  • Zestawy

DebuggerDisplay Atrybut ma jeden argument jest ciągiem, który ma być wyświetlany w kolumnie wartość dla wystąpienia typu.Ten ciąg może zawierać nawiasy klamrowe ({ i }).Tekst w parę nawiasów klamrowych zostaną ocenione jako pole, właściwości lub metody.

Jeśli obiekt C# zawiera przesłonięte ToString(), telefonicznie zastąpienia i Pokaż jej wyniku zamiast standardowego debugera {<typeName>}.Tak więc jeśli zostały zastąpione ToString(), nie trzeba używać DebuggerDisplay.Jeśli używasz zarówno, DebuggerDisplay atrybut ma pierwszeństwo przed ToString() zastąpić.

Czy narzędzie debugger ocenia tym niejawna ToString() wywołanie zależy od ustawienia użytkownika w Opcje okno dialogowe (Debugowanie kategorii, Ogólne strony).Visual Basic nie implementuje tym niejawna ToString() oceny.

Ważna uwagaWażne

Jeśli Pokaż surowego struktury obiektów w systemie windows zmiennych pole wyboru jest zaznaczone, w Narzędzia Opcje okno dialogowe, a następnie DebuggerDisplay atrybut jest ignorowany.

W poniższej tabeli przedstawiono kilka możliwych sposobów wykorzystania DebuggerDisplay atrybut i przykład wyjść.

Atrybut

Dane wyjściowe pojawiające się w wartość kolumny)

[DebuggerDisplay("x = {x} y = {y}")]

Używane w danym typie z polami x i y.

x = 5 y = 18

[DebuggerDisplay("String value is {getString()}")]Składnia parametru mogą się różnić między językami.W związku z tym go używać z rozwagą.

String value is [5, 6, 6]

DebuggerDisplayrównież mogą akceptować parametry nazwane.

Parametry

Cel

Name, Type

Parametry te mają wpływ na Nazwa i typu kolumny zmiennej systemu windows. (Można ich ustawiać ciągi za pomocą tej samej składni, co konstruktor.)Nadużywania tych parametrów lub niepoprawne, ich użycie może spowodować wyjście mylące.

Target, TargetTypeName

Określa typ docelowy, gdy używany jest atrybut na poziomie zestawu.

[!UWAGA]

Używa pliku autoexp.cs DebuggerDisplay atrybut na poziomie zestawu.Plik autoexp.cs Określa rozszerzenia domyślne, używanych przez program Visual Studio dla zmiennych języka C#.Można sprawdzić w pliku autoexp.cs przykłady sposobów użycia DebuggerDisplay atrybut lub można modyfikować i skompilować plik autoexp.cs, aby zmienić domyślne rozszerzenia.Należy koniecznie wykonać kopię zapasową pliku autoexp.cs przed przystąpieniem do modyfikacji.Należy wskazać Microsoft.VisualStudio.DebuggerVisualizers.dll w \Program Files\Microsoft 12.0\Common7\IDE\PublicAssemblies programu Visual Studio.Dokumenty/Visual w Moje Studio 2012/wizualizacje można znaleźć pliku autoexp.cs.

Użycie wyrażeń w DebuggerDisplay

Chociaż można używać ogólnego wyrażenia w nawiasach klamrowych w atrybucie DebuggerDisplay, praktyka ta nie jest zalecana.

Ogólne wyrażenie w DebuggerDisplay ma niejawny dostęp do this wskaźnik dla bieżącej instancji pola Typ docelowy.Wyrażenie nie ma dostępu do aliasów, mieszkańców lub wskaźników.Jeśli wyrażenie odwołuje się do właściwości, atrybutów na te właściwości nie są przetwarzane.Na przykład, kod C# [DebuggerDisplay("Object {count - 2}" wyświetliłaby Object 6 Jeśli pole count był 8.

Użycie wyrażeń w DebuggerDisplay może prowadzić do następujących problemów:

  • Wyrażenie jest sprawdzane przy każdym razem, gdy jest wyświetlany oceny wyrażenia jest najbardziej kosztownych operacji w debugerze.Może to spowodować problemy z wydajnością w krokowe wykonywanie kodu.Na przykład wyrażenie złożone, który jest używany do wyświetlania wartości w kolekcji lub na liście może być bardzo wolno, gdy duża liczba elementów.

  • Wyrażenia są oceniane przez tester wyrażenie języka bieżącej ramki stosu, a nie przez oceniającego języka, w którym został napisany wyrażenie.Może to powodować nieprzewidywalne skutki, gdy języki są różne.

  • Obliczenia wyrażenia można zmienić stan aplikacji.Na przykład wyrażenie ustawia wartość właściwości mutuje wartości właściwości w wykonywanie kodu.

Jednym ze sposobów zmniejszenia możliwych problemów oceny wyrażenia polega na wykorzystywaniu własności prywatnej, która wykonuje operację i zwraca wartość typu ciąg.Atrybut DebuggerDisplay można wpisać wartość tej właściwości prywatnych.W poniższym przykładzie implementuje ten wzór:

[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); }    }}

Przykład

Poniższy przykład kodu pokazuje, jak używać DebuggerDisplay, wraz z DebuggerBrowseable i DebuggerTypeProxy.Podczas przeglądania w oknie Debuger zmiennych, takich jak Watch okna, daje to rozszerzenie, który wygląda tak:

Nazwa

Wartość

Typ

Klucz

"trzy"

Obiekt {ciąg}

Wartość

3

Obiekt {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;
            }
        }
    }
}

Zobacz też

Informacje

Korzystanie z atrybutu DebuggerTypeProxy

Koncepcje

Wyświetlanie niestandardowych typów danych

Udoskonalanie debugowania za pomocą atrybutów wyświetlania debugera