web-dev-qa-db-fra.com

string.ToLower () et string.ToLowerInvariant ()

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 ()?

145
Louis Rhys

Selon la culture actuelle, ToLower peut produire une lettre minuscule spécifique à la culture, à laquelle vous ne vous attendiez pas. Comme produire ınfo sans le point sur le i au lieu de info et donc faufiler les comparaisons de chaînes. Pour cette raison, ToLowerInvariant doit être utilisé sur des données non spécifiques à une langue. Lorsque vous pouvez avoir une entrée utilisateur qui pourrait être dans leur langue/jeu de caractères natif, ce sera généralement la seule fois que vous utiliserez ToLower.

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

123
AaronLS

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 qui change de manière prévisible et qui n'est pas affectée par la culture actuelle, utilisez la méthode ToLowerInvariant. La méthode ToLowerInvariant est équivalente à ToLower (CultureInfo.InvariantCulture). Cette méthode est recommandée lorsqu'un ensemble de chaînes doit apparaître dans un ordre prévisible dans un contrôle d'interface utilisateur.

également

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

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

hth

44
danyolgiax

String.ToLower() utilise la culture par défaut alors que String.ToLowerInvariant() utilise la culture invariante. Donc, vous demandez essentiellement les différences entre la culture invariante et la comparaison des chaînes ordinales .

27
Cheng Chen

TL; DR:

Lorsque vous utilisez du "contenu" (articles, publications, commentaires, noms, espaces, etc., par exemple), utilisez ToLower(). Lorsque vous utilisez des "littéraux" (par exemple, des arguments de ligne de commande, des grammaires personnalisées, des chaînes qui doivent être des énums, etc.), utilisez ToLowerInvariant().

Exemples:

= Utiliser ToLowerInvariant de manière incorrecte =

En Turquie, DIŞ signifie "en dehors" et diş signifie "dent". Le boîtier inférieur approprié de DIŞ est dış. Donc, si vous utilisez incorrectement ToLowerInvariant, vous risquez d'avoir des fautes de frappe en Turquie.

= Utiliser ToLower de manière incorrecte =

Maintenant, supposez que vous écrivez un analyseur SQL. Quelque part vous aurez un 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 SÉLECTIONNEZ x DE books au lieu de SELECT X FROM books. Cependant, pour que le code ci-dessus fonctionne, une personne turque devra écrire SELECT x FROM books WHERE Author LİKE '%Adams%' _ (notez le point au-dessus de la capitale i, presque impossible à voir). Ce serait assez frustrant pour votre utilisateur turc.

13
Pace