Qual é a diferença e quando usar o quê? Qual é o risco se eu sempre uso ToLower()
e qual é o risco se eu sempre uso ToLowerInvariant()
?
Qual é a diferença e quando usar o quê? Qual é o risco se eu sempre uso ToLower()
e qual é o risco se eu sempre uso ToLowerInvariant()
?
Respostas:
Dependendo da cultura atual, o ToLower pode produzir uma letra minúscula específica da cultura, que você não está esperando. Como produzir ınfo
sem o ponto no i em vez deinfo
e, assim, fazer comparações de strings. Por esse motivo, ToLowerInvariant deve ser usado em qualquer dado não específico do idioma. Quando você pode ter uma entrada do usuário que possa estar no idioma / conjunto de caracteres nativos, geralmente é a única vez que você usa o ToLower.
Veja esta pergunta para um exemplo desse problema: Às vezes, C # - ToLower () está removendo o ponto da letra "I"
Eu acho que isso pode ser útil:
http://msdn.microsoft.com/en-us/library/system.string.tolowerinvariant.aspx
atualizar
Se o seu aplicativo depender do caso de uma sequência ser alterada de maneira previsível, não afetada pela cultura atual, use o método ToLowerInvariant. O método ToLowerInvariant é equivalente a ToLower (CultureInfo.InvariantCulture). O método é recomendado quando uma coleção de seqüências de caracteres deve aparecer em uma ordem previsível em um controle de interface do usuário.
Além disso
... ToLower é muito semelhante na maioria dos lugares a ToLowerInvariant. Os documentos indicam que esses métodos apenas mudarão o comportamento das culturas turcas. Além disso, nos sistemas Windows, o sistema de arquivos não diferencia maiúsculas de minúsculas, o que limita ainda mais seu uso ...
http://www.dotnetperls.com/tolowerinvariant-toupperinvariant
hth
String.ToLower()
usa a cultura padrão enquanto String.ToLowerInvariant()
usa a cultura invariável. Então você está essencialmente perguntando as diferenças entre cultura invariável e comparação de cadeias ordinais .
ToLower
variantes; Ordinal vs. invariável apenas altera a "ordem de classificação" de duas cadeias, não altera a comparação de igualdade.
TL; DR:
Ao trabalhar com "conteúdo" (por exemplo, artigos, postagens, comentários, nomes, lugares etc.), use ToLower()
. Ao trabalhar com "literais" (por exemplo, argumentos de linha de comando, gramáticas personalizadas, strings que devem ser enumerações, etc.), use ToLowerInvariant()
.
Exemplos:
= Usando ToLowerInvariant
incorretamente =
Em turco, DIŞ
significa "fora" e diş
significa "dente". O revestimento inferior adequado de DIŞ
é dış
. Portanto, se você usar ToLowerInvariant
incorretamente, poderá ter erros de digitação na Turquia.
= Usando ToLower
incorretamente =
Agora finja que você está escrevendo um analisador SQL. Em algum lugar você terá um código parecido com:
if(operator.ToLower() == "like")
{
// Handle an SQL LIKE operator
}
A gramática SQL não muda quando você altera culturas. Um francês não escreve em SÉLECTIONNEZ x DE books
vez de SELECT X FROM books
. No entanto, para que o código acima funcione, uma pessoa turca precisaria escrever SELECT x FROM books WHERE Author LİKE '%Adams%'
(observe o ponto acima da capital i, quase impossível de ver). Isso seria bastante frustrante para o seu usuário turco.