80 votes

Quel est le problème avec ToLowerInvariant() ?

J'ai la ligne de code suivante :

var connectionString = configItems.
                Find(item => item.Name.ToLowerInvariant() == "connectionstring");

L'analyse du code de VS 2010 m'indique ce qui suit :

Avertissement 7 CA1308 : Microsoft.Globalization : Dans la méthode ... remplacer l'appel à 'string.ToLowerInvariant()' par String.ToUpperInvariant().

Est-ce que cela signifie ToUpperInvariant() est plus fiable ?

34 votes

Notez, cependant, que l'utilisation de string.Equals(item.Name, "connectionstring", StringComparison.OrdinalIgnoreCase) est probablement la meilleure approche dans ce cas particulier.

0 votes

118voto

TomTom Points 35574

Google donne un indice pointant vers CA1308 : Normalisation des chaînes de caractères en majuscules

C'est écrit :

Les chaînes de caractères doivent être normalisées en majuscules. Un petit groupe de caractères, lorsqu'ils sont convertis en minuscules, ne peut pas faire d'aller-retour. Faire un aller-retour signifie convertir les caractères d'une locale à une autre locale qui représente les données de caractères différemment, et ensuite retrouver avec précision les caractères originaux à partir des caractères convertis.

Donc, oui - ToUpper est plus fiable que ToLower.

À l'avenir, je vous suggère de commencer par googler - je le fais pour tous les avertissements de FxCop qui me sont lancés ;) Cela aide beaucoup de lire la documentation correspondante ;)

13 votes

+1 pour "Aide beaucoup à lire la documentation correspondante" (et aussi pour être absolument correct...)

1 votes

Correct, certains caractères polonais ne font pas l'aller-retour ToLower().

14 votes

@ChrisBallance & TomTom Pourriez-vous fournir un exemple où l'échec de l'aller-retour entraîne un comportement indésirable ?

25voto

Henri Points 4037

En plus de ce que dit TomTom, .net est optimisé pour la comparaison de chaînes de caractères en majuscules. L'utilisation de l'invariant supérieur est donc théoriquement plus rapide que l'invariant inférieur.

C'est en effet ce qui est indiqué dans le CLR via C# comme le soulignent les commentaires. Le lien suivant cite cette partie du livre. Je ne suis pas sûr que ce soit vraiment vrai, car on ne trouve rien sur MSDN à ce sujet. Le guide de comparaison des chaînes de caractères sur msdn mentionne que toupperinvariant et tolowerinvariant sont égaux et ne préfère pas le premier.

Comparaisons de chaînes en C#

0 votes

+1 vrai. En fait, j'ai lu cela il y a quelques jours et j'ai été assez surpris qu'il y ait une différence. Cependant, je pense que la différence devrait être assez faible.

0 votes

Une référence à cela ? Faire du .NET pendant 10 ans et être qconsidéré comme très bon - je ne le savais pas ;) J'aimerais avoir des références.

2 votes

Je crois avoir vu cela dans CLR via C# (J Richter). Je préfère quand même utiliser un StringComparer explicite.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X