System.Globalization.CultureInfo.InvariantCulture – vlastnost

Tento článek obsahuje doplňující poznámky k referenční dokumentaci pro toto rozhraní API.

Invariantní jazyková verze nerozlišuje jazykovou verzi; je přidružený k anglickému jazyku, ale ne k žádné zemi nebo oblasti. Invariantní jazykovou verzi zadáte podle názvu pomocí prázdného řetězce ("") ve volání CultureInfo metody instance. Tato vlastnost , CultureInfo.InvariantCulturetaké načte instanci invariantní jazykové verze. Lze ji použít téměř v libovolné metodě v System.Globalization oboru názvů, který vyžaduje jazykovou verzi. Objekty vrácené vlastnostmi, jako CompareInfoje , DateTimeFormata NumberFormat také odrážejí porovnání řetězců a formátování konvence invariantní jazykové verze.

Na rozdíl od dat citlivých na jazykovou verzi, která se můžou měnit přizpůsobením uživatele nebo aktualizacemi rozhraní .NET Framework nebo operačního systému, jsou invariantní data jazykové verze stabilní v průběhu času a mezi nainstalovanými jazykovými verzemi a uživatelé je nemohou přizpůsobit. Díky tomu je invariantní jazyková verze zvlášť užitečná pro operace, které vyžadují výsledky nezávislé na jazykové verzi, například operace formátování a analýzy, které uchovávají formátovaná data, nebo operace řazení a řazení, které vyžadují, aby se data zobrazovala v pevném pořadí bez ohledu na jazykovou verzi.

Operace s řetězci

Invariantní jazykovou verzi můžete použít pro operace řetězců citlivé na jazykovou verzi, které nejsou ovlivněny konvencemi aktuální jazykové verze a které jsou konzistentní napříč jazykovými verzemi. Můžete například chtít, aby se seřazená data zobrazovala v pevném pořadí nebo použila standardní sadu konvencí pro písmena na řetězce bez ohledu na aktuální jazykovou verzi. K tomu předáte InvariantCulture objekt metodě, která má CultureInfo parametr, například Compare(String, String, Boolean, CultureInfo) a ToUpper(CultureInfo).

Zachování dat

Vlastnost InvariantCulture lze použít k zachování dat ve formátu nezávislém na jazykové verzi. Poskytuje známý formát, který se nemění a který lze použít k serializaci a deserializaci dat napříč jazykovými verzemi. Po deserializaci dat je možné je naformátovat odpovídajícím způsobem na základě kulturních konvencí aktuálního uživatele.

Pokud se například rozhodnete zachovat data data a času v řetězcové podobě, můžete objekt DateTime.ToString(String, IFormatProvider) předat InvariantCulture do metody nebo DateTimeOffset.ToString(IFormatProvider) k vytvoření řetězce a předat InvariantCulture objekt do metody nebo DateTimeOffset.Parse(String, IFormatProvider, DateTimeStyles) metodu DateTime.Parse(String, IFormatProvider) a převést řetězec zpět na hodnotu data a času. Tato technika zajišťuje, že se základní hodnoty data a času nezmění, když se data čtou nebo zapisují uživateli z různých jazykových verzí.

Následující příklad používá invariantní jazykovou verzi k zachování DateTime hodnoty jako řetězec. Potom řetězec parsuje a zobrazí jeho hodnotu pomocí konvencí formátování francouzských (Francie) a němčiny (Německo).

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

Rozhodnutí o zabezpečení

Pokud provádíte rozhodnutí o zabezpečení (například jestli chcete povolit přístup k systémovému prostředku) na základě výsledku porovnání řetězců nebo změny případu, neměli byste používat neutrální jazykovou verzi. Místo toho byste měli provést porovnání s rozlišováním malých a velkých písmen nebo bez rozlišování malých a velkých písmen voláním metody, která zahrnuje StringComparison parametr a zadá buď StringComparison.Ordinal nebo StringComparison.OrdinalIgnoreCase jako argument. Kód, který provádí operace řetězců citlivých na jazykovou verzi, může způsobit ohrožení zabezpečení, pokud se aktuální jazyková verze změní nebo pokud se jazyková verze v počítači, na kterém je spuštěný kód, liší od jazykové verze, která se používá k otestování kódu. Naproti tomu pořadové porovnání závisí výhradně na binární hodnotě porovnávaných znaků.