Depuración de C#:[DebuggerDisplay] o ToString()?
debugging (3)
"Cuando creas una clase o estructura personalizada, debes anular el método ToString para proporcionar información sobre tu tipo al código del cliente". - MSDN
Si lo que ToString()
devuelve y ve que en el depurador no es lo que le gustaría, entonces usa DebuggerDisplayAttribute
.
Hay dos formas de aumentar la utilidad de la información de depuración en lugar de ver {MyNamespace.MyProject.MyClass}
en el depurador.
Estos son el uso de DebuggerDisplayAttribute
y el método 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 el uno al otro? ¿Alguna razón para no hacer ambas cosas? ¿Es una preferencia puramente personal?
El uso de [DebuggerDisplay]
solo está destinado al depurador. La anulación de ToString () tiene el "efecto secundario" de cambiar la pantalla en tiempo de ejecución.
Esto puede o no ser algo bueno.
A menudo, desea más información durante la depuración que su ToString()
estándar de ToString()
, 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 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.
La lentitud del depurador también se puede tener en cuenta:
DebuggerDisplayAttribute
interpreta la expresión de formato DebuggerDisplayAttribute
después de cada paso / punto de corte de depuración.
ToString
está compilado en su código y, por lo tanto, es mucho más rápido de ejecutar por el depurador.
Es lo mismo con los puntos de interrupción condicionales: si la expresión condicional es demasiado lenta para interpretar por el depurador cada vez que la ejecución llega al punto de interrupción, puede ser útil eliminar el punto de interrupción y agregar un código temporal como este: if (condition) Debugger.Break();