web-dev-qa-db-fra.com

C # Débogage: [DebuggerDisplay] ou Tostring ()?

Il existe deux manières d'augmenter l'utilité des informations de débogage au lieu de voir {MyNamespace.MyProject.MyClass} Dans le débogueur.

Celles-ci sont l'utilisation du [DebuggerDisplayAttribute][1] Et la méthode ToString().

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);
    }
}

Y a-t-il une raison de préférer l'un à l'autre? Toute raison de ne pas faire les deux? Est-ce une préférence purement personnelle?

83
bwerks

L'utilisation de [DebuggerDisplay] Est signifiée uniquement pour le débogueur. Tostring primordial () a l'effet secondaire de modifier l'affichage au moment de l'exécution.

Cela peut être ou non une bonne chose.

Souvent, vous souhaitez plus d'informations lors du débogage que votre standard ToString() Sortie, auquel cas vous utiliseriez les deux.

Par exemple, dans votre cas, la mise en œuvre "Tostring" me semble étrange. Je m'attendrais à ce qu'une implémentation de ToString de classe "personne" () pour simplement renvoyer le nom directement, pas "Nom = PersonnesName". Cependant, pendant le débogage, je souhaiterais peut-être ces informations supplémentaires.

86
Reed Copsey

"Lorsque vous créez une classe ou une structure personnalisée, vous devriez remplacer la méthode de tostring afin de fournir des informations sur votre type à code client." - MSDN

Si ce que ToString() retourne et que vous voyez dans le débogueur n'est pas ce que vous souhaitez, vous utilisez alors DebuggerDisplayAttribute.

5
Piotr Perak

La lenteur du débogueur peut également être prise en compte:

DebuggerDisplayAttribute Le format expression est interprété par le débogueur après chaque étape de débogage/point d'arrêt.

ToString est compilé dans votre code et est donc beaucoup plus rapide à exécuter par le débogueur.

C'est la même chose avec les points d'arrêt conditionnels: si l'expression conditionnelle est trop lente pour interpréter par le débogueur chaque fois que l'exécution atteint le point d'arrêt, il peut être utile de supprimer le point d'arrêt et d'ajouter un code temporaire comme celui-ci: if (condition) Debugger.Break();

4
Wizou