Propriedade System.Globalization.CultureInfo.InvariantCulture

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

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

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 invariante 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 de 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 invariante 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 classificados apareçam em uma ordem fixa ou aplique um conjunto padrão de convenções de caixa a cadeias de caracteres, independentemente da cultura atual. Para fazer isso, você passa o InvariantCulture objeto para um método que tem um CultureInfo parâmetro, como Compare(String, String, Boolean, CultureInfo) e ToUpper(CultureInfo).

Dados persistentes

A InvariantCulture propriedade 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 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 no formato de cadeia de caracteres, poderá passar o objeto para o método ou para criar a cadeia de caracteres e poderá passar o objeto para o InvariantCultureDateTime.Parse(String, IFormatProvider)InvariantCultureDateTime.ToString(String, IFormatProvider) método or DateTimeOffset.Parse(String, IFormatProvider, DateTimeStyles) para converter a cadeia de caracteres de volta em um valor de data e hora.DateTimeOffset.ToString(IFormatProvider) Essa técnica garante que os valores de data e hora subjacentes não sejam alterados quando os dados são lidos ou gravados por usuários de culturas diferentes.

O exemplo a seguir usa a cultura invariante para persistir um DateTime valor 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: {0}\n" , input);

         // 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 {0} culture: {1}" ,
                           frFr.Name, 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 {0} culture: {1}" ,
                           deDe.Name, 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 ou não 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 maiúsculas e minúsculas, não deverá usar a cultura invariante. Em vez disso, você deve executar uma comparação ordinal que diferencia maiúsculas de minúsculas ou que não diferencia maiúsculas de minúsculas chamando um método que inclui um parâmetro e fornecendo um ou StringComparison.OrdinalIgnoreCase como um StringComparisonStringComparison.Ordinal 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 exclusivamente do valor binário dos caracteres comparados.