Partilhar via


Propriedade System.Globalization.CultureInfo.InvariantCulture

Este artigo fornece observações complementares à documentação de referência para esta API.

A cultura invariante é insensível à cultura; está associado ao idioma inglês, mas não a qualquer país/região. Você especifica a cultura invariante 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 praticamente qualquer método no namespace System.Globalization que requer uma cultura. Os objetos retornados por propriedades como CompareInfo, DateTimeFormate NumberFormat também refletem a comparação de cadeia de caracteres e as convenções de formatação da cultura invariante.

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 invariantes 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 invariante 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

Pode usar a cultura invariante para operações em cadeias de caracteres que são sensíveis à cultura mas que não são afetadas pelas convenções da cultura atual e permanecem consistentes entre culturas. Por exemplo, você pode desejar que os dados classificados apareçam em uma ordem fixa ou aplicar um conjunto padrão de convenções de invólucro a cadeias de caracteres, independentemente da cultura atual. Para fazer isso, passe o objeto InvariantCulture para um método que tenha um parâmetro CultureInfo, como Compare(String, String, Boolean, CultureInfo) e ToUpper(CultureInfo).

Dados persistentes

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

Por exemplo, se você optar por persistir dados de data e hora em forma 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 poderá 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 para 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 culturas diferentes.

O exemplo a seguir usa a cultura invariante para persistir um valor DateTime como uma cadeia de caracteres. Em seguida, ele 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 permitir o acesso a um recurso do sistema) com base no resultado de uma comparação de cadeia de caracteres ou uma alteração de maiúsculas e minúsculas, não deverá usar a cultura invariante. Em vez disso, deve executar uma comparação ordinal sensível a maiúsculas e minúsculas ou insensível a maiúsculas e minúsculas, chamando um método que inclua um parâmetro StringComparison e fornecendo StringComparison.Ordinal ou StringComparison.OrdinalIgnoreCase como argumento. O código que executa operações de cadeia de caracteres sensíveis à cultura pode 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. Em contraste, uma comparação ordinal depende apenas do valor binário dos caracteres comparados.