string.ToLower () et string.ToLowerInvariant ()

164

Quelle est la différence et quand utiliser quoi? Quel est le risque si j'utilise toujours ToLower()et quel est le risque si j'utilise toujours ToLowerInvariant()?

Louis Rhys
la source
4
Peut-être devriez-vous plutôt normaliser les chaînes en majuscules. Voir msdn.microsoft.com/en-us/library/bb386042.aspx
habakuk

Réponses:

149

Selon la culture actuelle, ToLower peut produire une lettre minuscule spécifique à la culture, à laquelle vous ne vous attendez pas. Par exemple, produire ınfosans le point sur le i au lieu de infoet ainsi faire des comparaisons de chaînes. Pour cette raison, ToLowerInvariant doit être utilisé sur toutes les données non spécifiques à une langue. Lorsque vous pourriez avoir une entrée utilisateur qui pourrait être dans leur langue / jeu de caractères natifs, ce serait généralement la seule fois où vous utilisez ToLower.

Voir cette question pour un exemple de ce problème: C # - ToLower () supprime parfois le point de la lettre «I»

AaronLS
la source
45

Je pense que cela peut être utile:

http://msdn.microsoft.com/en-us/library/system.string.tolowerinvariant.aspx

mettre à jour

Si votre application dépend du cas d'une chaîne changeant de manière prévisible qui n'est pas affectée par la culture actuelle, utilisez la méthode ToLowerInvariant. La méthode ToLowerInvariant est équivalente à ToLower (CultureInfo.InvariantCulture). La méthode est recommandée lorsqu'une collection de chaînes doit apparaître dans un ordre prévisible dans un contrôle d'interface utilisateur.

aussi

... ToLower est très similaire dans la plupart des endroits à ToLowerInvariant. Les documents indiquent que ces méthodes ne changeront de comportement qu'avec les cultures turques. De plus, sur les systèmes Windows, le système de fichiers est insensible à la casse, ce qui limite encore son utilisation ...

http://www.dotnetperls.com/tolowerinvariant-toupperinvariant

hth

danyolgiax
la source
@danyolgiax Pouvez-vous nous en dire plus? ne peut pas déduire son utilité du lien de msdn. Merci
Prerak K
2
oui ToLowerInvariant ne fonctionne pas en turc comme prévu. İ devient ı
MonsterMMORPG
28

String.ToLower()utilise la culture par défaut tandis que String.ToLowerInvariant()utilise la culture invariante. Vous demandez donc essentiellement les différences entre la culture invariante et la comparaison de chaînes ordinales .

Cheng Chen
la source
Non, il ne l'est pas. «Ordinal» est une troisième option - une manière légèrement différente d '«ignorer» la culture actuelle. La distinction n'est pas pertinente pour discuter des ToLowervariantes; Ordinal vs invariant modifie simplement "l'ordre de tri" de deux chaînes, ne change pas la comparaison d'égalité.
ToolmakerSteve
28

TL; DR:

Lorsque vous travaillez avec du «contenu» (par exemple des articles, des messages, des commentaires, des noms, des lieux, etc.), utilisez ToLower(). Lorsque vous travaillez avec des "littéraux" (par exemple, des arguments de ligne de commande, des grammaires personnalisées, des chaînes qui devraient être des énumérations, etc.), utilisez ToLowerInvariant().

Exemples:

= Utilisation ToLowerInvariantincorrecte =

En turc, DIŞsignifie «extérieur» et dişsignifie «dent». Le boîtier inférieur approprié de DIŞest dış. Donc, si vous n'utilisez ToLowerInvariantpas correctement, vous pouvez avoir des fautes de frappe en Turquie.

= Utilisation ToLowerincorrecte =

Imaginez maintenant que vous écrivez un analyseur SQL. Quelque part, vous aurez du code qui ressemble à:

if(operator.ToLower() == "like")
{
  // Handle an SQL LIKE operator
}

La grammaire SQL ne change pas lorsque vous changez de culture. Un Français n'écrit pas à la SÉLECTIONNEZ x DE booksplace de SELECT X FROM books. Cependant, pour que le code ci-dessus fonctionne, une personne turque devrait écrire SELECT x FROM books WHERE Author LİKE '%Adams%'(notez le point au-dessus du i majuscule, presque impossible à voir). Ce serait assez frustrant pour votre utilisateur turc.

Rythme
la source