Executar alterações de maiúsculas e minúsculas que não diferenciam a cultura

Os métodos String.ToUpper, String.ToLower, Char.ToUpper e Char.ToLower fornecem sobrecargas que não aceitam quaisquer parâmetros. Por padrão, essas sobrecargas sem parâmetros executam alterações de maiúsculas e minúsculas com base no valor do CultureInfo.CurrentCulture. Isso produz resultados sensíveis a maiúsculas e minúsculas que podem variar de acordo com a cultura. Para deixar claro se você deseja que as mudanças de maiúsculas e minúsculas sejam sensíveis à cultura ou não sejam insensíveis à cultura, você deve usar as sobrecargas desses métodos que exigem que você especifique explicitamente um parâmetro culture. Para mudanças de maiúsculas e minúsculas sensíveis à cultura, especifique CultureInfo.CurrentCulture para o parâmetro culture. Para mudanças de maiúsculas e minúsculas insensíveis à cultura, especifique CultureInfo.InvariantCulture para o parâmetro culture.

Muitas vezes, as cadeias de caracteres são convertidas em um formato padrão para permitir uma pesquisa mais fácil. Quando as cadeias de caracteres são usadas dessa maneira, você deve especificar CultureInfo.InvariantCulture para o parâmetro culture, pois o valor de Thread.CurrentCulture pode mudar potencialmente entre o tempo que o formato é alterado e o tempo que a pesquisa ocorre.

Se uma decisão de segurança é baseada em uma operação de modificação de maiúsculas e minúsculas, a operação deve ser insensível à cultura para garantir que o resultado não seja afetado pelo valor de CultureInfo.CurrentCulture. Confira a seção "Comparações de cadeia de caracteres que usam a cultura atual" Práticas recomendadas para usar cadeias de caracteres para obter um exemplo que demonstra como as operações de cadeias de caracteres que diferenciam a cultura podem produzir resultados inconsistentes.

String.ToUpper e String.ToLower

Para maior clareza do código, é recomendado sempre usar sobrecargas dos métodos String.ToUpper e String.ToLower, que permitem especificar uma cultura explicitamente. Por exemplo, o código a seguir realiza uma pesquisa de identificador. A operação key.ToLower é sensível à cultura por padrão, mas esse comportamento não fica claro ao ler o código.

Exemplo

Shared Function LookupKey(key As String) As Object
   Return internalHashtable(key.ToLower())
End Function
static object LookupKey(string key)
{
    return internalHashtable[key.ToLower()];
}

Para que a operação key.ToLower não faça distinção de cultura, altere o exemplo anterior como a seguir para usar CultureInfo.InvariantCulture explicitamente ao alterar maiúsculas e minúsculas.

Shared Function LookupKey(key As String) As Object
    Return internalHashtable(key.ToLower(CultureInfo.InvariantCulture))
End Function
static object LookupKey(string key)
{
    return internalHashtable[key.ToLower(CultureInfo.InvariantCulture)];
}

Char.ToUpper e Char.ToLower

Embora os métodos Char.ToUpper e Char.ToLower tenham as mesmas características que os métodos String.ToUpper e String.ToLower, as únicas culturas afetadas são a turca (Turquia) e a azeri (latim, Azerbaijão). Essas são apenas duas culturas com diferenças de maiúsculas e minúsculas de um único caractere. Para saber mais sobre esse mapeamento exclusivo de maiúsculas e minúsculas, confira a seção "Maiúsculas e minúsculas" na documentação da classe String. Para clareza de código e para garantir resultados consistentes, é recomendado sempre usar as sobrecargas desses métodos que aceitam um parâmetro CultureInfo.

Confira também