Compartilhar via


Propriedade System.Globalization.CultureInfo.InvariantCulture

Este artigo fornece comentários complementares à documentação de referência para esta API.

A cultura invariável não é sensível às diferenças culturais; está associada ao idioma inglês, mas não a nenhum país/região. Especifique a cultura invariável pelo nome usando uma cadeia de caracteres vazia ("") na chamada para um método de instanciação CultureInfo. Essa propriedade, CultureInfo.InvariantCulture, também recupera uma instância da cultura invariante. Ele pode ser usado em quase qualquer método no namespace System.Globalization que requer uma cultura. Os objetos retornados por propriedades como CompareInfo, DateTimeFormate NumberFormat também refletem as convenções de comparação e formatação de cadeia de caracteres da cultura invariável.

Ao contrário dos dados sensíveis à cultura, que estão sujeitos a alterações pela personalização do usuário ou por atualizações do .NET Framework ou do sistema operacional, os dados de cultura invariáveis são estáveis ao longo do tempo e entre culturas instaladas e não podem ser personalizados pelos usuários. Isso torna a cultura invariável particularmente útil para operações que exigem resultados independentes da cultura, como operações de formatação e análise que persistem dados formatados ou operações de classificação e ordenação que exigem que os dados sejam exibidos em uma ordem fixa, independentemente da cultura.

Operações de cadeia de caracteres

Você pode usar a cultura invariável para operações de cadeia de caracteres sensíveis à cultura que não são afetadas pelas convenções da cultura atual e que são consistentes entre culturas. Por exemplo, talvez você queira que os dados ordenados apareçam em uma ordem fixa ou aplicar um conjunto padrão de regras de uso de maiúsculas e minúsculas a cadeias de caracteres, independentemente da cultura atual. Para fazer isso, você passa o objeto InvariantCulture para um método que tem um parâmetro CultureInfo, como Compare(String, String, Boolean, CultureInfo) e ToUpper(CultureInfo).

Persistência de dados

A propriedade InvariantCulture pode ser usada para persistir dados em um formato independente de cultura. Isso fornece um formato conhecido que não é alterado e que pode ser usado para serializar e desserializar dados entre culturas. Depois que os dados forem desserializados, eles poderão ser formatados adequadamente com base nas convenções culturais do usuário atual.

Por exemplo, se você optar por manter dados de data e hora no formulário de cadeia de caracteres, poderá passar o objeto InvariantCulture para o método DateTime.ToString(String, IFormatProvider) ou DateTimeOffset.ToString(IFormatProvider) para criar a cadeia de caracteres e passar o objeto InvariantCulture para o método DateTime.Parse(String, IFormatProvider) ou DateTimeOffset.Parse(String, IFormatProvider, DateTimeStyles) para converter a cadeia de caracteres de volta em um valor de data e hora. Essa técnica garante que os valores de data e hora subjacentes não sejam alterados quando os dados forem lidos ou gravados por usuários de diferentes culturas.

O exemplo a seguir usa a cultura invariável para persistir um valor DateTime como uma cadeia de caracteres. Em seguida, analisa a cadeia de caracteres e exibe seu valor usando as convenções de formatação das culturas francesa (França) e alemã (Alemanha).

using System;
using System.IO;
using System.Globalization;

public class Example
{
   public static void Main()
   {
      // Persist the date and time data.
      StreamWriter sw = new StreamWriter(@".\DateData.dat");

      // Create a DateTime value.
      DateTime dtIn = DateTime.Now;
      // Retrieve a CultureInfo object.
      CultureInfo invC = CultureInfo.InvariantCulture;

      // Convert the date to a string and write it to a file.
      sw.WriteLine(dtIn.ToString("r", invC));
      sw.Close();

      // Restore the date and time data.
      StreamReader sr = new StreamReader(@".\DateData.dat");
      String input;
      while ((input = sr.ReadLine()) != null)
      {
         Console.WriteLine($"Stored data: {input}\n");

         // Parse the stored string.
         DateTime dtOut = DateTime.Parse(input, invC, DateTimeStyles.RoundtripKind);

         // Create a French (France) CultureInfo object.
         CultureInfo frFr = new CultureInfo("fr-FR");
         // Displays the date formatted for the "fr-FR" culture.
         Console.WriteLine($"Date formatted for the {frFr.Name} culture: {dtOut.ToString("f", frFr)}");

         // Creates a German (Germany) CultureInfo object.
         CultureInfo deDe= new CultureInfo("de-De");
         // Displays the date formatted for the "de-DE" culture.
         Console.WriteLine($"Date formatted for {deDe.Name} culture: {dtOut.ToString("f", deDe)}");
      }
      sr.Close();
   }
}
// The example displays the following output:
//    Stored data: Tue, 15 May 2012 16:34:16 GMT
//
//    Date formatted for the fr-FR culture: mardi 15 mai 2012 16:34
//    Date formatted for de-DE culture: Dienstag, 15. Mai 2012 16:34
Imports System.Globalization
Imports System.IO

Module Example
   Public Sub Main()
      ' Persist the date and time data.
      Dim sw As New StreamWriter(".\DateData.dat")
      
      ' Create a DateTime value.      
      Dim dtIn As DateTime = DateTime.Now
      ' Retrieve a CultureInfo object.
      Dim invC As CultureInfo = CultureInfo.InvariantCulture
      
      ' Convert the date to a string and write it to a file.
      sw.WriteLine(dtIn.ToString("r", invC))
      sw.Close()

      ' Restore the date and time data.
      Dim sr As New StreamReader(".\DateData.dat")
      Dim input As String = String.Empty
      Do While sr.Peek() >= 0 
         input = sr.ReadLine()
         Console.WriteLine("Stored data: {0}" , input)    
         Console.WriteLine()
         
         ' Parse the stored string.
         Dim dtOut As DateTime = DateTime.Parse(input, invC, DateTimeStyles.RoundtripKind)

         ' Create a French (France) CultureInfo object.
         Dim frFr As New CultureInfo("fr-FR")
         ' Displays the date formatted for the "fr-FR" culture.
         Console.WriteLine("Date formatted for the {0} culture: {1}" , 
                           frFr.Name, dtOut.ToString("f", frFr))

         ' Creates a German (Germany) CultureInfo object.
         Dim deDe As New CultureInfo("de-De")
         ' Displays the date formatted for the "de-DE" culture.
         Console.WriteLine("Date formatted for {0} culture: {1}" , 
                           deDe.Name, dtOut.ToString("f", deDe))
      Loop
      sr.Close()
   End Sub
End Module
' The example displays the following output:
'    Stored data: Tue, 15 May 2012 16:34:16 GMT
'    
'    Date formatted for the fr-FR culture: mardi 15 mai 2012 16:34
'    Date formatted for de-DE culture: Dienstag, 15. Mai 2012 16:34

Decisões de segurança

Se você estiver tomando uma decisão de segurança (como se deseja permitir o acesso a um recurso do sistema) com base no resultado de uma comparação de cadeia de caracteres ou de uma alteração de caso, não será possível usar a cultura invariável. Em vez disso, é necessário executar uma comparação ordinal sensível ou insensível a maiúsculas e minúsculas, chamando um método que inclui um parâmetro StringComparison e fornecendo StringComparison.Ordinal ou StringComparison.OrdinalIgnoreCase como um argumento. O código que executa operações de cadeia de caracteres sensíveis à cultura poderá causar vulnerabilidades de segurança se a cultura atual for alterada ou se a cultura no computador que está executando o código for diferente da cultura usada para testar o código. Por outro lado, uma comparação ordinal depende apenas do valor binário dos caracteres comparados.