Évaluation de chaîne conditionnelle dans les méthodes de débogage
Il est courant d’utiliser des chaînes interpolées comme messages d’assertion, par exemple :
Debug.Assert(result != x, $"Unexpected result {result}");
Toutefois, dans les versions précédentes, une chaîne est créée pour le message, y compris le résultat de mise en forme, à chaque appel, même si la condition est true
. Et l’utilisation classique des assertions est qu’elles concernent une condition qui doit toujours être vraie.
C# 10 ajoute le support d’une meilleure interpolation de chaînes, notamment la possibilité de cibler des « gestionnaires » personnalisés en plus des chaînes. Dans .NET 6, la classe Debug a de nouvelles surcharges de Assert, WriteIf et WriteLineIf qui utilisent cette fonctionnalité pour évaluer de manière conditionnelle les éléments de mise en forme de chaînes interpolées uniquement si le message est requis. Le compilateur C# préférera ces nouvelles surcharges. Si les éléments de mise en forme mutent et que le programme attend que ces mutations soient visibles même si l’assertion n’a pas été déclenchée, vous pouvez observer une différence de comportement.
Comportement précédent
Dans le code suivant, r.ToString()
sera toujours appelé.
Debug.Assert(true, $"{r.ToString()}");
Nouveau comportement
Dans le code suivant, r.ToString()
ne sera jamais appelé, car le message n’est nécessaire que si la condition est false
.
Debug.Assert(true, $"{r.ToString()}");
Version introduite
6.0 RC 1
Type de changement cassant
Ce changement peut affecter la compatibilité source.
Raison du changement
Ce changement a été introduit pour améliorer les performances.
Action recommandée
Les chaînes interpolées utilisées avec des méthodes Debug ne doivent pas muter l’état partagé. (Ces méthodes sont également conditionnelles à la constante de compilation DEBUG
.) Si, pour une raison quelconque, il est essentiel de conserver l’ancien comportement, ajoutez un cast (string)
avant la chaîne interpolée. Ce cast force le compilateur à se lier à la surcharge existante et garantit que la chaîne est toujours matérialisée.
API affectées
- System.Diagnostics.Debug.Assert(Boolean, String)
- System.Diagnostics.Debug.Assert(Boolean, String, String)
- System.Diagnostics.Debug.Assert(Boolean, String, String, Object[])
- System.Diagnostics.Debug.WriteIf(Boolean, String)
- System.Diagnostics.Debug.WriteIf(Boolean, String, String)
- System.Diagnostics.Debug.WriteIf(Boolean, Object, String)
- System.Diagnostics.Debug.WriteLineIf(Boolean, String)
- System.Diagnostics.Debug.WriteLineIf(Boolean, String, String)
- System.Diagnostics.Debug.WriteLineIf(Boolean, Object, String)