Depuración de C #: [DebuggerDisplay] o ToString ()?

92

Hay dos formas de aumentar la utilidad de depurar información en lugar de verla {MyNamespace.MyProject.MyClass}en el depurador.

Estos son el uso DebuggerDisplayAttributey el ToString()método.

using System.Diagnostics;
...

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

o

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

¿Hay alguna razón para preferir uno al otro? ¿Alguna razón para no hacer ambas cosas? ¿Es una preferencia puramente personal?

bwerks
fuente

Respuestas:

94

El uso [DebuggerDisplay]está destinado solo para el depurador. Anular ToString () tiene el "efecto secundario" de cambiar la pantalla en tiempo de ejecución.

Esto puede ser bueno o no.

A menudo, desea más información durante la depuración que su ToString()salida estándar , en cuyo caso usaría ambos.

Por ejemplo, en su caso, la implementación de "ToString" me parece extraña. Esperaría que una implementación ToString () de la clase "Person" devuelva el nombre directamente, no "Name = PersonsName". Sin embargo, durante la depuración, es posible que desee esa información adicional.

Reed Copsey
fuente
9
+1 Para agregar al punto de "efecto secundario" de Reed: a ToStringmenudo se usa como una "cadena de visualización predeterminada", por ejemplo, por Console.WriteLineo enlace de datos WPF.
Stephen Cleary
Por supuesto; el formato de la cadena se acaba de dar como ejemplo visual para enfatizar su similitud con la cadena dada para DebuggerDisplay. El formato DebuggerDisplay también podría devolver el nombre directamente, como usted dice. Sin embargo, veo su punto sobre los efectos secundarios: es el tipo de distinción que estoy buscando. Normalmente no utilizo mucho el método ToString en las clases (excepto para el propósito que he dado anteriormente), por lo que sus otros usos no fueron tan evidentes para mí. ¡Gracias!
bwerks
5

"Cuando crea una clase o estructura personalizada, debe anular el método ToString para proporcionar información sobre su tipo al código del cliente". - MSDN

Si lo que ToString()regresa y ve en el depurador no es lo que le gustaría, entonces use DebuggerDisplayAttribute.

Piotr Perak
fuente
4

También se puede tener en cuenta la lentitud del depurador:

DebuggerDisplayAttributeLa expresión de formato es interpretada por el depurador después de cada paso de depuración / punto de interrupción.

ToStringse compila en su código y, por lo tanto, el depurador lo ejecuta mucho más rápido.

Lo mismo ocurre con los puntos de interrupción condicionales: si la expresión condicional es demasiado lenta para que el depurador la interprete cada vez que la ejecución alcanza el punto de interrupción, puede ser útil eliminar el punto de interrupción y, en su lugar, agregar un código temporal como este: if (condition) Debugger.Break();

Wizou
fuente