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 |
"três" |
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