Właściwość System.Globalization.CultureInfo.InvariantCulture

Ten artykuł zawiera dodatkowe uwagi dotyczące dokumentacji referencyjnej dla tego interfejsu API.

Niezmienna kultura jest niewrażliwa na kulturę; jest on skojarzony z językiem angielskim, ale nie z żadnym krajem/regionem. W wywołaniu metody tworzenia wystąpienia należy określić niezmienną kulturę według nazwy przy użyciu pustego CultureInfo ciągu (""). Ta właściwość CultureInfo.InvariantCulture, pobiera również wystąpienie niezmiennej kultury. Można go używać w prawie dowolnej metodzie w System.Globalization przestrzeni nazw, która wymaga kultury. Obiekty zwracane przez właściwości, takie jak CompareInfo, DateTimeFormat, oraz NumberFormat odzwierciedlają konwencje porównywania i formatowania ciągów niezmiennej kultury.

W przeciwieństwie do danych wrażliwych na kulturę, które mogą ulec zmianie przez dostosowanie użytkownika lub aktualizacje programu .NET Framework lub systemu operacyjnego, niezmienne dane kultury są stabilne w czasie i w różnych zainstalowanych kulturach i nie mogą być dostosowywane przez użytkowników. Sprawia to, że niezmienna kultura jest szczególnie przydatna w przypadku operacji wymagających wyników niezależnych od kultury, takich jak formatowanie i analizowanie operacji utrwalających sformatowane dane lub operacje sortowania i porządkowania, które wymagają wyświetlania danych w stałej kolejności niezależnie od kultury.

Operacje dotyczące ciągów

Możesz użyć niezmiennej kultury dla operacji ciągów wrażliwych na kulturę, które nie mają wpływu na konwencje bieżącej kultury i które są spójne w różnych kulturach. Na przykład możesz chcieć, aby posortowane dane pojawiły się w stałej kolejności lub zastosować standardowy zestaw konwencji wielkości liter do ciągów niezależnie od bieżącej kultury. W tym celu należy przekazać InvariantCulture obiekt do metody, która ma CultureInfo parametr , taki jak Compare(String, String, Boolean, CultureInfo) i ToUpper(CultureInfo).

Utrwalanie danych

Właściwość InvariantCulture może służyć do utrwalania danych w formacie niezależnym od kultury. Zapewnia znany format, który nie zmienia się i który może służyć do serializacji i deserializacji danych między kulturami. Po deserializacji danych można je odpowiednio sformatować na podstawie konwencji kulturowych bieżącego użytkownika.

Jeśli na przykład zdecydujesz się utrwalić dane daty i godziny w postaci ciągu, możesz przekazać InvariantCulture obiekt do DateTime.ToString(String, IFormatProvider) metody lub DateTimeOffset.ToString(IFormatProvider) w celu utworzenia ciągu i przekazać InvariantCulture obiekt do DateTime.Parse(String, IFormatProvider) metody lub DateTimeOffset.Parse(String, IFormatProvider, DateTimeStyles) , aby przekonwertować ciąg z powrotem na wartość daty i godziny. Ta technika zapewnia, że bazowe wartości daty i godziny nie zmieniają się, gdy dane są odczytywane lub zapisywane przez użytkowników z różnych kultur.

W poniższym przykładzie użyto niezmiennej kultury do utrwalania DateTime wartości jako ciągu. Następnie analizuje ciąg i wyświetla jego wartość przy użyciu konwencji formatowania kultur francuskich (Francja) i Niemieckich (Niemcy).

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

Decyzje dotyczące zabezpieczeń

Jeśli podejmujesz decyzję o zabezpieczeniach (np. czy zezwolić na dostęp do zasobu systemowego) na podstawie wyniku porównania ciągów lub zmiany wielkości liter, nie należy używać niezmiennej kultury. Zamiast tego należy wykonać porównanie porządkowe z uwzględnieniem wielkości liter lub wielkości liter, wywołując metodę zawierającą StringComparison parametr i podając StringComparison.Ordinal argument lub StringComparison.OrdinalIgnoreCase jako argument. Kod wykonujący operacje ciągów wrażliwych na kulturę może spowodować luki w zabezpieczeniach, jeśli bieżąca kultura zostanie zmieniona lub jeśli kultura na komputerze, na którym jest uruchomiony kod, różni się od kultury używanej do testowania kodu. Natomiast porównanie porządkowe zależy wyłącznie od wartości binarnej porównywanych znaków.