Udostępnij za pośrednictwem


Za pomocą atrybutu DebuggerDisplay

DebuggerDisplay Atrybutu (System.Diagnostics.DebuggerDisplayAttribute) steruje sposobem wyświetlania klasy lub pola w systemie windows zmienne debugera.Atrybut ten można stosować do:

  • Klasy

  • Strukturach

  • Obiekty delegowane

  • Teksty stałe

  • Pola

  • Właściwości

  • Zestawy

DebuggerDisplay Atrybut ma jeden argument jest ciągiem mają być wyświetlane w kolumnie wartość dla wystąpienia typu.Ten ciąg może zawierać nawiasy klamrowe ({ i }).Tekst w parę nawiasów klamrowych będą oceniane jako pola właściwości lub metody.

Jeśli obiekt C# zawiera przesłonięte ToString(), telefonicznie zastąpienia debugera i pokazać jego wynik standard {<typeName>}.Zatem jeśli mają być zastąpione ToString(), nie trzeba używać DebuggerDisplay.Jeśli korzystasz zarówno, DebuggerDisplay atrybutu ma pierwszeństwo przed ToString() zastąpić.

Czy tym niejawna ocenia debugera 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 zmienne jest zaznaczone pole wyboru w Opcje narzędzia okno dialogowe, a następnie DebuggerDisplay atrybut jest ignorowany.

W poniższej tabeli przedstawiono kilka możliwych zastosowań DebuggerDisplay atrybutu i przykład wyjść.

Atrybut

Wyjście znajdujących się w wartość kolumny)

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

Używany na typ z pola x i y.

x = 5 y = 18

[DebuggerDisplay("String value is {getString()}")]Składnia parametru mogą się różnić między językami.Dlatego używać go ostrożnie.

String value is [5, 6, 6]

DebuggerDisplaymożna również zaakceptować nazwane parametry.

Parametry

Cel

Name, Type

Parametry te mają wpływ na Nazwa i typu kolumny zmiennej systemu windows.(Te można ustawić przy użyciu tej samej składni jako Konstruktor ciągi.)Unikały nadużywania tych parametrów lub niepoprawnie, przy użyciu może spowodować wyjście mylące.

Target, TargetTypeName

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

[!UWAGA]

Używa pliku autoexp.cs DebuggerDisplay atrybut na poziomie zestawu.Plik autoexp.cs Określa rozszerzenia domyślnego, Visual Studio używanego dla zmiennych C#.Można sprawdzić w pliku autoexp.cs przykłady użycia DebuggerDisplay atrybutu lub można modyfikować i skompilować plik autoexp.cs, aby zmienić rozszerzenia domyślnego.Należy wykonać kopię zapasową pliku autoexp.cs przed przystąpieniem do modyfikacji.W folderze \Program Files\Microsoft 11.0\Common7\IDE\PublicAssemblies Visual Studio musi odwoływać się Microsoft.VisualStudio.DebuggerVisualizers.dll.Można znaleźć dokumenty/Visual w moich Studio 2012/wykorzystasz pliku autoexp.cs.

Za pomocą wyrażeń w DebuggerDisplay

Chociaż można użyć wyrażenia ogólne w nawiasach w atrybucie DebuggerDisplay, praktyka ta nie jest zalecane.

Ogólne wyrażenie w DebuggerDisplay ma niejawna dostęp do this wskaźnik dla bieżącego wystąpienia tylko typ docelowy.Wyrażenie nie ma dostępu do aliasów, lokalne lub wskaźniki.Jeśli wyrażenie odwołuje się do właściwości, atrybutów tych właściwości nie są przetwarzane.Na przykład kod C# [DebuggerDisplay("Object {count - 2}" wyświetliłby Object 6 Jeśli pole count był 8.

Korzystanie z wyrażeń DebuggerDisplay może prowadzić do następujących zagadnień:

  • Ocena wyrażenia jest najbardziej kosztownych operacji debugera i wyrażenie jest sprawdzane w każdym jest wyświetlany.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 listy może być bardzo powolne, gdy jest duża liczba elementów.

  • Wyrażenia są przetwarzane przez oceniającego wyrażenia języka bieżącej ramki stosu, a nie przez oceniającego języka, w którym zapisano wyrażenie.Gdy są różne języki, może to powodować nieprzewidywalne skutki.

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

Tworzenie właściwości prywatnej, który wykonuje operację i zwraca ciąg jest jednym ze sposobów zmniejszenia możliwych problemów wyrażenia.Atrybut DebuggerDisplay można wyowietlać wartość tej właściwości prywatnej.Poniższy przykład 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, łącznie z DebuggerBrowseable i DebuggerTypeProxy.Podczas wyświetlania w oknie Debuger zmiennych, takich jak Watch okna, wytwarza rozszerzenia, która wygląda następująco:

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

Za pomocą atrybutu DebuggerTypeProxy

Koncepcje

Wyświetlanie niestandardowych typów danych

Zwiększanie debugowania z atrybutami wyświetlania debugera