J'ai un code comme celui-ci:
If key.Equals("search", StringComparison.OrdinalIgnoreCase) Then
DoSomething()
End If
Je me fiche de l'affaire. Dois - je utiliser OrdinalIgnoreCase
, InvariantCultureIgnoreCase
ou CurrentCultureIgnoreCase
?
.net
vb.net
localization
Dave Haynes
la source
la source
Réponses:
Les nouveaux documents .Net ont désormais un tableau pour vous aider à décider lequel est le mieux à utiliser dans votre situation.
Extrait des « Nouvelles recommandations pour l'utilisation de chaînes dans Microsoft .NET 2.0 » de MSDN
la source
"Straße"
et"STRASSE"
. Lors de l'utilisationOrdinalIgnoreCase
desEquals
retoursfalse
, alors queInvariantCultureIgnoreCase
dit qu'ils sont égaux.Tout dépend
La comparaison des chaînes Unicode est difficile:
voir: http://en.wikipedia.org/wiki/Unicode_equivalence
Si vous essayez de comparer 2 chaînes Unicode de manière insensible à la casse et que vous souhaitez que cela fonctionne PARTOUT , vous avez un problème impossible.
L'exemple classique est le turc je , qui lorsqu'il est mis en majuscule devient İ (notez le point)
Par défaut, le framework .Net utilise généralement la CurrentCulture pour les fonctions liées aux chaînes, avec une exception très importante
.Equals
qui utilise une comparaison ordinale (octet par octet).Cela conduit, de par sa conception, à ce que les différentes fonctions de chaîne se comportent différemment selon la culture de l'ordinateur.
Néanmoins, nous voulons parfois une comparaison «à usage général», insensible à la casse.
Par exemple, vous souhaiterez peut-être que votre comparaison de chaînes se comporte de la même manière, quel que soit l'ordinateur sur lequel votre application est installée.
Pour y parvenir, nous avons 3 options:
Les règles d'équivalence Unicode sont compliquées, ce qui signifie que l'utilisation de la méthode 1) ou 2) est plus coûteuse que
OrdinalIgnoreCase
. Le fait queOrdinalIgnoreCase
cela n'effectue aucune normalisation Unicode spéciale signifie que certaines chaînes qui sont rendues de la même manière sur un écran d'ordinateur ne seront pas considérées comme identiques. Par exemple:"\u0061\u030a"
et les"\u00e5"
deux rendent å. Cependant, une comparaison ordinale sera considérée comme différente.Le choix que vous choisissez dépend fortement de l'application que vous créez.
Microsoft a son ensemble de recommandations avec des directives explicites. Cependant, il est vraiment important de comprendre la notion d'équivalence unicode avant d'aborder ces problèmes.
Aussi, gardez à l'esprit que OrdinalIgnoreCase est un type très spécial de bête, qui cueille et choisit un peu un ordinal comparé à certains aspects lexicographiques mixtes. Cela peut être déroutant.
la source
Je suppose que cela dépend de votre situation. Étant donné que les comparaisons ordinales examinent en fait les valeurs Unicode numériques des caractères, elles ne seront pas le meilleur choix lorsque vous triez par ordre alphabétique. Pour les comparaisons de chaînes, cependant, l'ordinal serait un peu plus rapide.
la source
Cela dépend de ce que vous voulez, même si j'éviterais la culture invariante sauf si vous êtes très sûr que vous ne voudrez plus jamais localiser le code pour d' autres langues. Utilisez plutôt CurrentCulture.
En outre, OrdinalIgnoreCase doit respecter les nombres, qui peuvent ou non être ce que vous voulez.
la source
La réponse très simple est que, sauf si vous utilisez le turc, vous n'avez pas besoin d'utiliser InvariantCulture.
Voir le lien suivant:
En C # quelle est la différence entre ToUpper () et ToUpperInvariant ()?
la source