Usando o atributo DebuggerDisplay
This topic applies to:
Edition |
Visual Basic |
C# |
F# |
C++ |
Web Developer |
---|---|---|---|---|---|
Express |
|||||
Pro, Premium e Ultimate |
O DebuggerDisplay atributo (System.Diagnostics.DebuggerDisplayAttribute) controla como uma classe ou campo é exibido no windows de variável de depurador. This attribute can be applied to:
Classes
Structs
Delegates
Enums
Fields
Properties
Assemblies
O DebuggerDisplay atributo tem um argumento único, que é uma seqüência de caracteres a ser exibido na coluna valor para instâncias do tipo. Essa seqüência pode conter chaves ({ e }). Text within a pair of braces will be evaluated as a field, property or method.
C# código, você pode usar uma expressão geral entre as chaves. A expressão tem acesso implícito para o this o ponteiro para a instância atual do tipo de destino somente. The expression has no access to aliases, locals, or pointers. If the expression references properties, attributes on those properties are not processed.
Se um objeto C# tem um substituído ToString(), o depurador irá chama a substituição e mostrar seu resultado em vez do padrão {<typeName>}. Portanto, se você tiver substituído ToString(), você não precisará usar DebuggerDisplay. Se você usar ambos, o DebuggerDisplay atributo tem precedência sobre a ToString() substituição.
Se o depurador avalia implícito nesse ToString() chamada depende de uma configuração de usuário na Opções caixa de diálogo (depuração categoria, Geral página). Visual Basic não implementa implícito nesse ToString() avaliação.
Importante |
---|
Se o Mostrar estrutura bruta de objetos em janelas variáveis caixa de seleção estiver marcada no Opções de ferramentas caixa de diálogo, o DebuggerDisplay atributo é ignorado. |
A tabela a seguir mostra algumas utilizações possíveis da DebuggerDisplay saídas de exemplo e atributo.
Attribute |
Saída que aparecem na 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 idiomas. Portanto, usá-lo com cuidado. |
String value is [5, 6, 6] |
[DebuggerDisplay("Object {count - 2}: {(flag) ? \"yes\" : \"no\"}")] Sintaxe de expressões varia entre idiomas. Portanto, usá-lo com cuidado. |
Object 6: yes |
[DebuggerDisplay("Last = {_lastName,nq} {_var == null ? \"\" : \"First = \" + _firstName,nq}")] ,nqretirar as aspas. |
Se houver um sobrenome Last = lastname First = firstname Caso contrário: Last = lastname |
DebuggerDisplaytambém pode aceitar parâmetros nomeados.
Parameters |
Purpose |
---|---|
Name, Type |
These parameters affect the Name and Type columns of the variable windows. (They can be set to strings using the same syntax as the constructor.) Uso excessivo esses parâmetros ou usá-los incorretamente, pode causar a saída confusa. |
Target, TargetTypeName |
Specifies the target type when the attribute is used at the assembly level. |
Observação |
---|
O arquivo de autoexp.cs usa o DebuggerDisplay atributo no nível do assembly. O arquivo de autoexp.cs determina as expansões padrão que usa o Visual Studio para C# de 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 para alterar o padrão expansões. Certifique-se de fazer backup do arquivo de autoexp.cs antes de modificá-lo. Você deve fazer referência a Debuggervisualisadors em \Arquivos de Programas\Microsoft 9.0\Common7\IDE\PublicAssemblies de Visual Studio. Você pode encontrar o arquivo de autoexp.cs em um de Meus documentos/Visual Studio 9.0/visualizadores. |
Exemplo
O exemplo de código a seguir mostra como usar DebuggerDisplay, junto com DebuggerBrowseable e DebuggerTypeProxy. When viewed in a debugger variables window, such as the Watch window, it produces an expansion that looks like this:
Name |
Value |
Type |
---|---|---|
Key |
"three" |
object {string} |
Value |
3 |
object {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
Referência
Usando um atributo DebuggerTypeProxy
Conceitos
Exibir os tipos de dados personalizados
Aprimorando a depuração com os atributos de exibição do depurador