C# Language Attribut DebuggerDisplay


Exemple

L'ajout de l'attribut DebuggerDisplay modifie la façon dont le débogueur affiche la classe lorsqu'il est survolé.

Les expressions enveloppées dans {} seront évaluées par le débogueur. Cela peut être une propriété simple comme dans l'exemple suivant ou une logique plus complexe.

[DebuggerDisplay("{StringProperty} - {IntProperty}")]
public class AnObject
{
   public int ObjectId { get; set; }
   public string StringProperty { get; set; }
   public int IntProperty { get; set; }
}

Exemple DebuggerDisplay

L'ajout de ,nq avant le crochet de fermeture supprime les guillemets lors de la sortie d'une chaîne.

[DebuggerDisplay("{StringProperty,nq} - {IntProperty}")]

Même si les expressions générales sont autorisées dans {} elles ne sont pas recommandées. L'attribut DebuggerDisplay sera écrit dans la métadonnée de l'assemblage sous forme de chaîne. Les expressions dans {} ne sont pas vérifiées pour la validité. Ainsi, un attribut DebuggerDisplay contenant une logique plus complexe que par exemple une arithmétique simple pourrait fonctionner correctement en C #, mais la même expression évaluée dans VB.NET ne sera probablement pas syntaxiquement valide et produira une erreur lors du débogage.

Une façon de rendre DebuggerDisplay plus agnostique en DebuggerDisplay langage consiste à écrire l'expression dans une méthode ou une propriété et à l'appeler à la place.

[DebuggerDisplay("{DebuggerDisplay(),nq}")]
public class AnObject
{
   public int ObjectId { get; set; }
   public string StringProperty { get; set; }
   public int IntProperty { get; set; }

   private string DebuggerDisplay()
    {
        return $"{StringProperty} - {IntProperty}"";
    }
}

On peut souhaiter que DebuggerDisplay toutes ou certaines propriétés et lors du débogage et de l'inspection du type d'objet.
L'exemple ci-dessous entoure également la méthode d'assistance avec #if DEBUG car DebuggerDisplay est utilisé dans les environnements de débogage.

[DebuggerDisplay("{DebuggerDisplay(),nq}")]
public class AnObject
{
   public int ObjectId { get; set; }
   public string StringProperty { get; set; }
   public int IntProperty { get; set; }

#if DEBUG
   private string DebuggerDisplay()
    {
        return
            $"ObjectId:{this.ObjectId}, StringProperty:{this.StringProperty}, Type:{this.GetType()}";
    }
    #endif
}