Criação de cultura e mapeamento de casos em modo invariante de globalização
Essa mudança revolucionária afeta o modo invariante da globalização de duas maneiras:
- Anteriormente, o .NET permitia que qualquer cultura fosse criada no modo invariante da globalização, desde que o nome da cultura estivesse em conformidade com o BCP-47. No entanto, os dados de cultura invariantes foram usados em vez dos dados de cultura reais. A partir do .NET 6, uma exceção será lançada se você criar qualquer cultura diferente da cultura invariante no modo invariante de globalização.
- Anteriormente, o modo invariante de globalização suportava apenas o mapeamento de casos para caracteres ASCII. A partir do .NET 6, o modo invariante de globalização fornece suporte completo ao mapeamento de maiúsculas e minúsculas para todos os caracteres definidos por Unicode. O mapeamento de casos é usado em operações como comparações de cadeia de caracteres, pesquisas de cadeia de caracteres e cadeias de caracteres de caixa superior ou inferior.
O modo invariante de globalização é usado para aplicativos que não exigem suporte à globalização. Ou seja, o aplicativo é executado sem acesso a dados e comportamento específicos da cultura. O modo invariante de globalização é habilitado por padrão em alguns contêineres do Docker, por exemplo, contêineres alpinos.
Comportamento antigo
Em versões anteriores do .NET quando o modo invariante de globalização está habilitado:
Se um aplicativo criar uma cultura que não seja a cultura invariante, a operação será bem-sucedida, mas a cultura retornada sempre usará os dados de cultura invariante em vez dos dados de cultura reais.
O mapeamento de casos foi realizado apenas para caracteres ASCII. Por exemplo:
if ("Á".Equals("á", StringComparison.CurrentCultureIgnoreCase)) // Evaluates to false.
Novo comportamento
A partir do .NET 6 quando o modo invariante de globalização está habilitado:
Se um aplicativo tentar criar uma cultura que não seja a cultura invariante, uma CultureNotFoundException exceção será lançada.
O mapeamento de casos é realizado para todos os caracteres definidos por Unicode. Por exemplo:
if ("Á".Equals("á", StringComparison.CurrentCultureIgnoreCase)) // Evaluates to true.
Versão introduzida
.NET 6
Razão para a alteração
A mudança de criação de cultura foi introduzida para diagnosticar mais facilmente problemas relacionados à cultura. Alguns usuários não sabem que seus aplicativos estão sendo executados em um ambiente onde o modo invariante de globalização está habilitado. Eles podem experimentar um comportamento inesperado e não fazem a associação com o modo invariante da globalização, por isso é difícil diagnosticar o problema.
O suporte completo ao mapeamento de casos foi introduzido para melhor usabilidade e experiência no modo invariante de globalização.
Ação recomendada
Na maioria dos casos, nenhuma ação é necessária. No entanto, se desejar o comportamento anterior de criação de cultura, você pode definir uma opção de configuração de tempo de execução para permitir a criação de qualquer cultura no modo invariante de globalização. Para obter mais informações, consulte Culturas predefinidas.
APIs afetadas
- CultureInfo
- System.Globalization.CultureInfo.CreateSpecificCulture(String)
- System.Globalization.CultureInfo.GetCultureInfo
- RegionInfo
- Qualquer API que execute invólucro, comparação ou pesquisa de cadeia de caracteres