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

91

Il existe deux façons d'augmenter l'utilité des informations de débogage au lieu de les voir {MyNamespace.MyProject.MyClass}dans le débogueur.

Ce sont l'utilisation DebuggerDisplayAttributeet la ToString()méthode.

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? Une raison de ne pas faire les deux? Est-ce une préférence purement personnelle?

bwerks
la source

Réponses:

94

L'utilisation [DebuggerDisplay]est destinée uniquement au débogueur. Le remplacement de ToString () a pour «effet secondaire» de changer l'affichage au moment de l'exécution.

Cela peut être une bonne chose ou non.

Souvent, vous voulez plus d'informations pendant le débogage que votre ToString()sortie standard , auquel cas vous utiliserez les deux.

Par exemple, dans votre cas, l'implémentation "ToString" me semble étrange. Je m'attendrais à ce qu'une implémentation de ToString () de classe "Person" renvoie simplement le nom directement, et non "Name = PersonsName". Cependant, pendant le débogage, je pourrais vouloir ces informations supplémentaires.

Reed Copsey
la source
9
+1 Pour ajouter au point «effet secondaire» de Reed: ToStringest souvent utilisé comme «chaîne d'affichage par défaut», par exemple, par Console.WriteLineou par liaison de données WPF.
Stephen Cleary
Sûr; le format de la chaîne a été simplement donné pour un exemple visuel pour souligner sa similitude avec la chaîne donnée pour DebuggerDisplay. Le format DebuggerDisplay pourrait également renvoyer le nom directement, comme vous le dites. Je vois cependant votre point sur les effets secondaires - c'est le genre de distinction que je recherche. Je n'utilise généralement pas beaucoup la méthode ToString sur les classes (sauf dans le but que j'ai donné ci-dessus), donc ses autres utilisations ne me sont pas aussi apparentes. Merci!
bwerks
5

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

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

Piotr Perak
la source
4

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

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

ToStringest 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 à 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 à la place du code temporaire comme celui-ci: if (condition) Debugger.Break();

Wizou
la source