Depuração C #: [DebuggerDisplay] ou ToString ()?

91

Existem duas maneiras de aumentar a utilidade das informações de depuração, em vez de ver {MyNamespace.MyProject.MyClass}no depurador.

Estes são o uso DebuggerDisplayAttributee o ToString()método.

using System.Diagnostics;
...

[DebuggerDisplay("Name = {Name}")]
public class Person
{
    public string Name;
}

ou

public class Person
{
    public string Name;
    public override string ToString()
    {
        return string.Format("Name = {0}", Name);
    }
}

Existe alguma razão para preferir um ao outro? Alguma razão para não fazer as duas coisas? É uma preferência puramente pessoal?

Bwerks
fonte

Respostas:

94

Usando [DebuggerDisplay] destina-se apenas ao depurador. Substituir ToString () tem o "efeito colateral" de alterar a exibição em tempo de execução.

Isso pode ou não ser uma coisa boa.

Freqüentemente, você deseja mais informações durante a depuração do que sua ToString()saída padrão ; nesse caso, você usaria ambos.

Por exemplo, no seu caso, a implementação de "ToString" parece estranha para mim. Eu esperaria que uma implementação ToString () da classe "Person" retornasse apenas o Name diretamente, não "Name = PersonsName". No entanto, durante a depuração, posso querer essas informações extras.

Reed Copsey
fonte
9
+1 Para adicionar ao ponto de "efeito colateral" de Reed: ToStringé freqüentemente usado como uma "string de exibição padrão", por exemplo, por Console.WriteLineou ligação de dados WPF.
Stephen Cleary
Certo; o formato da string foi fornecido apenas como um exemplo visual para enfatizar sua similaridade com a string fornecida para DebuggerDisplay. O formato DebuggerDisplay também pode retornar o nome diretamente, como você diz. Eu entendo o seu ponto sobre os efeitos colaterais - é o tipo de distinção que estou procurando. Eu normalmente não utilizo o método ToString em classes (exceto para o propósito que apresentei acima), então seus outros usos não eram tão aparentes para mim. Obrigado!
bwerks
5

"Ao criar uma classe ou estrutura personalizada, você deve substituir o método ToString para fornecer informações sobre o seu tipo ao código do cliente." - MSDN

Se o que ToString()retorna e você vê no depurador não é o que você gostaria, então você usa DebuggerDisplayAttribute.

Piotr Perak
fonte
4

A lentidão do depurador também pode ser levada em consideração:

DebuggerDisplayAttributeA expressão de formato é interpretada pelo depurador após cada etapa / ponto de interrupção de depuração.

ToStringé compilado em seu código e, portanto, é muito mais rápido de executar pelo depurador.

O mesmo ocorre com os pontos de interrupção condicionais: se a expressão condicional for muito lenta para ser interpretada pelo depurador sempre que a execução atingir o ponto de interrupção, pode ser útil remover o ponto de interrupção e, em vez disso, adicionar código temporário como este: if (condition) Debugger.Break();

Wizou
fonte