string.ToLower () e string.ToLowerInvariant ()

163

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

Louis Rhys
fonte
4
Talvez você deva normalizar as strings para maiúsculas. Consulte msdn.microsoft.com/en-us/library/bb386042.aspx
habakuk

Respostas:

148

Dependendo da cultura atual, o ToLower pode produzir uma letra minúscula específica da cultura, que você não está esperando. Como produzir ınfosem 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"

AaronLS
fonte
45

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

danyolgiax
fonte
@danyolgiax Por favor, você pode elaborar mais? não é possível inferir sua utilidade no link do msdn. Graças
Prerak K
2
Sim ToLowerInvariant não está funcionando em turco como esperado. #
Is Monster
28

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 .

Cheng Chen
fonte
Não, ele não é. "Ordinal" é uma terceira opção - uma maneira ligeiramente diferente de "ignorar" a cultura atual. A distinção não é relevante na discussão de ToLowervariantes; Ordinal vs. invariável apenas altera a "ordem de classificação" de duas cadeias, não altera a comparação de igualdade.
Home
27

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 ToLowerInvariantincorretamente =

Em turco, DIŞsignifica "fora" e dişsignifica "dente". O revestimento inferior adequado de DIŞé dış. Portanto, se você usar ToLowerInvariantincorretamente, poderá ter erros de digitação na Turquia.

= Usando ToLowerincorretamente =

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 booksvez 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.

Ritmo
fonte