2010-05-10 7 views
50

je la ligne de code suivante:Quel est le problème avec ToLowerInvariant()?

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

VS 2010 analyse de code me dit ce qui suit:

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

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

+28

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

+0

http://stackoverflow.com/questions/773703/normalization-of-strings-with-string-toupperinvariant – kenny

Répondre

86

Google donne une indication montrant CA1308: Normalize strings to uppercase

Il dit:

Les chaînes doivent être normalisées en majuscules. Un petit groupe de caractères, lorsqu'ils sont convertis en minuscules, ne peut pas faire un 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 récupérer avec précision les caractères originaux des caractères convertis.

Donc, oui - ToUpper est plus fiable que ToLower.

Dans l'avenir, je suggère googler premier - je le fais pour tous ces avertissements FxCop je suis jeté autour;) aide beaucoup à lire la documentation correspondante;)

+10

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

+0

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

+36

Googling m'a conduit à cette question. – richardtallent

19

En plus ce que dit TomTom, .net est optimisé pour comparaison de chaînes en majuscules. Donc, utiliser l'invariant supérieur est théoriquement plus rapide que l'invariant inférieur.

Ceci est en effet indiqué dans CLR via C# comme indiqué dans les commentaires. Le lien suivant cite cette partie du livre. Je ne suis pas sûr que ce soit bien sûr vrai car il n'y a rien sur MSDN à propos de ce sujet. Le guide de comparaison de chaînes sur msdn mentionne que toupperinvariant et tolowerinvariant sont égaux et ne préfèrent pas le premier. Cependant,

String comparisons in C#

+0

+1 vrai. J'ai lu à ce sujet il y a quelques jours et j'ai été très surpris qu'il y ait une différence. Cependant, je pense que la différence devrait être assez petite. – gehho

+0

Toute référence à cela? Faire. NET 10 ans et être considéré comme très bon - je ne le savais pas;) Aimerait avoir une référence. – TomTom

+2

Je pense que j'ai vu ça dans CLR via C# (J Richter). Toujours préférer utiliser un StringComparer explicite. –