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()?
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.
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 ...
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.
Réponses:
Selon la culture actuelle, ToLower peut produire une lettre minuscule spécifique à la culture, à laquelle vous ne vous attendez pas. Par exemple, produire
ınfo
sans le point sur le i au lieu deinfo
et 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»
la source
Je pense que cela peut être utile:
http://msdn.microsoft.com/en-us/library/system.string.tolowerinvariant.aspx
mettre à jour
aussi
http://www.dotnetperls.com/tolowerinvariant-toupperinvariant
hth
la source
String.ToLower()
utilise la culture par défaut tandis queString.ToLowerInvariant()
utilise la culture invariante. Vous demandez donc essentiellement les différences entre la culture invariante et la comparaison de chaînes ordinales .la source
ToLower
variantes; Ordinal vs invariant modifie simplement "l'ordre de tri" de deux chaînes, ne change pas la comparaison d'égalité.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.), utilisezToLowerInvariant()
.Exemples:
= Utilisation
ToLowerInvariant
incorrecte =En turc,
DIŞ
signifie «extérieur» etdiş
signifie «dent». Le boîtier inférieur approprié deDIŞ
estdış
. Donc, si vous n'utilisezToLowerInvariant
pas correctement, vous pouvez avoir des fautes de frappe en Turquie.= Utilisation
ToLower
incorrecte =Imaginez maintenant que vous écrivez un analyseur SQL. Quelque part, vous aurez du code qui ressemble à:
La grammaire SQL ne change pas lorsque vous changez de culture. Un Français n'écrit pas à la
SÉLECTIONNEZ x DE books
place deSELECT X FROM books
. Cependant, pour que le code ci-dessus fonctionne, une personne turque devrait écrireSELECT 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.la source