Partilhar via


Usando o atributo DebuggerDisplay

Este tópico se aplica a:

Edição

Visual Basic

C#

C++

Desenvolvedores Web

Express

Padrão

PRO e equipe

Legenda de tabela:

Aplica-se

Não é aplicada

Comando ou comandos oculta por padrão.

The DebuggerDisplay atributo)System.Diagnostics.DebuggerDisplayAttribute) controla como uma classe ou campo é exibido nas janelas de variáveis do depurador. Este atributo pode ser aplicado a:

  • Classes

  • Estruturas

  • Delegados

  • Enumerações

  • Campos

  • Propriedades

  • Conjuntos de Módulos (Assemblies)

The DebuggerDisplay atributo tem um argumento único, que é uma seqüência de caracteres a ser exibido na coluna de valor para instâncias do tipo. Essa seqüência pode conter chaves ({ e }). Texto dentro de um par de chaves será avaliado como um campo, propriedade ou método.

No código translation from VPE for Csharp, você pode usar uma expressão geral entre as chaves.A expressão tem acesso implícito ao this ponteiro para a instância corrente do tipo de destino somente. A expressão não tem acesso para aliases, locais, ou ponteiros.Se a expressão fizer referência a propriedades, atributos nessas propriedades não são processados.

Se um objeto translation from VPE for Csharp tem uma substituir ToString(), o depurador irá chama a substituir e mostrar seu resultado em vez do padrão {<typeName>}. Portanto, se você tiver substituído ToString(), não é necessário usar DebuggerDisplay. Se você usar ambos, a DebuggerDisplay atributo tem precedência sobre o ToString() Substitua.

Se o depurador avalia esta implícita ToString() telefonar depende de uma configuração de usuário na Opções caixa de diálogo Depuração categoria de , Geral página).Visual Basic não implementa esta implícita ToString() avaliação.

A tabela a seguir mostra algumas utilizações possíveis do DebuggerDisplay exemplo do atributo e entrega.

Atributo

Saída que aparece no Valor coluna)

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

Usado em um tipo com campos x e y.

x = 5 y = 18

[DebuggerDisplay("String value is {getString()}")]

Sintaxe do parâmetro pode variar entre os idiomas.Por isso, use-o com cuidado.

String value is [5, 6, 6]

[DebuggerDisplay("Object {count - 2}: {(flag) ? \"yes\" : \"no\"}")]

Sintaxe de expressões varia entre idiomas.Por isso, use-o com cuidado.

Object 6: yes

[DebuggerDisplay("Last = {_lastName,nq} {_var == null ? \"\" : \"First = \" + _firstName,nq}")]

,nq distância retira as aspas.

Se houver um sobrenome

Last = lastname First = firstname

Caso contrário:

Last = lastname

DebuggerDisplay também pode aceitar parâmetros nomeados.

Parâmetros

Objetivo

Name, Type

Esses parâmetros afetam a colunas Name e Type das janelas de variável.(Elas podem ser definidas como sequências de caracteres usando a mesma sintaxe do construtor.)

Sobreusar esses parâmetros ou usá-los incorretamente, poderá provocar a saída confusa.

Target, TargetTypeName

Especifica o tipo de destino quando o atributo é usado no nível do conjunto de módulos (assembly).

Observação:

O arquivo autoexp.cs usa o DebuggerDisplay atributo no nível do assembly. O arquivo autoexp.cs determina as expansões padrão que Visual Studio usa para translation from VPE for Csharp variáveis.Você pode examinar o arquivo autoexp.cs para obter exemplos de como usar o DebuggerDisplay atributo ou você pode modificar e compilar o arquivo autoexp.cs alterar expansões padrão. Certifique-se de fazer backup do arquivo autoexp.cs antes de modificá-lo.Você deve fazer referência Microsoft.VisualStudio.DebuggerVisualizers.dll em \programa Files\Microsoft Visual Studio 9.0\Common7\IDE\PublicAssemblies.Você pode encontrar o arquivo autoexp.cs em Meus Documentos/Visual Studio 9.0/Visualizers.

Exemplo

O exemplo de código a seguir mostra como usar DebuggerDisplay, juntamente com DebuggerBrowseable e DebuggerTypeProxy. Quando exibido em uma janela de variáveis do depurador, tais como a janela Watch, ela produz uma expansão parecida com esta:

Nome

Valor

Type (Tipo)

Chave

&quot;três&quot;

objeto {string}

Valor

3

objeto {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("Count = {hashtable.Count}")]
[DebuggerTypeProxy(typeof(HashtableDebugView))]
class MyHashtable
{
    public Hashtable hashtable;

    public MyHashtable()
    {
        hashtable = new Hashtable();  
    }

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

Consulte também

Conceitos

Exibir os tipos de dados personalizados

Aprimorando a depuração com os atributos de exibição do depurador

Referência

Usando um atributo DebuggerTypeProxy