2010-07-06 9 views
61

Hay dos maneras de aumentar la utilidad de la información de depuración en lugar de ver {MyNamespace.MyProject.MyClass} en el depurador.Depuración de C#: [DebuggerDisplay] o ToString()?

Estos son el uso del método DebuggerDisplayAttribute y ToString().

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 una a la otra? ¿Alguna razón para no hacer ambas cosas? ¿Es una preferencia puramente personal?

Respuesta

69

El uso de [DebuggerDisplay] es solo para el depurador. La anulación de ToString() tiene el "efecto secundario" de cambiar la pantalla en tiempo de ejecución.

Esto puede o no ser una buena cosa.

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

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

+7

+1 Para agregar al punto de "efecto secundario" de Reed: 'ToString' a menudo se usa como una" cadena de pantalla predeterminada ", por ejemplo, mediante' Console.WriteLine' o WPF data binding. –

+0

Sure; el formato de la cadena se acaba de dar para un ejemplo visual para enfatizar su similitud con la cadena dada para DebuggerDisplay. El formato DebuggerDisplay también podría devolver el nombre directamente, como dices. Sin embargo, veo tu punto acerca de los efectos secundarios: es el tipo de distinción que estoy buscando. Normalmente no utilizo mucho el método ToString en las clases (excepto por el propósito que he dado más arriba) 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 devuelve ToString() y usted ve en el depurador no es lo que le gustaría, entonces usted usa DebuggerDisplayAttribute.

0

lentitud del depurador también puede tenerse en cuenta:

DebuggerDisplayAttribute expresión de formato es interpretarse por el depurador después de cada etapa de depuración/punto de interrupción.

ToString es compilado en su código y por lo tanto es mucho más rápido de ejecutar por el depurador.

Eso es lo mismo con los puntos de interrupción condicionales: si la expresión condicional es demasiado lento para interpretar por el depurador cada vez que la ejecución alcanza el punto de interrupción, puede ser útil para eliminar el punto de interrupción y en lugar de añadir código temporal como esto: if (condition) Debugger.Break();

Cuestiones relacionadas