Sdílet prostřednictvím


Použití vlastnosti InvariantCulture

Vlastnost InvariantCulture nepředstavuje ani neutrální ani konkrétní jazykovou verzi. Představuje třetí typ jazykové verze, který je nezávislý na konkrétní jazykové verzi. Je spojen s jazykem angličtina, ale nikoli se zemí nebo oblastí. Aplikace tuto vlastnost může použít pro téměř libovolnou metodu z obor názvů System.Globalization, která vyžaduje jazykovou verzi. Aplikace by však měla používat invariantní jazykovou verzi pouze pro procesy, které vyžadují nezávislost výsledků na jazykové verzi, jako například formátování a analýza dat, která jsou ukládána do souboru. V ostatních případech vytváří výsledky, které mohou být lingvisticky nesprávné nebo kulturně nevhodné.

Důležité informace o zabezpečení

Pokud se má na základě výsledků porovnání řetězců nebo změny velikosti písmen rozhodovat o zabezpečení, pak by aplikace měla použít porovnání podle pořadového čísla, které ignoruje velikost písmen, namísto použití InvariantCulture. Výchozí implementace metod, jako jsou například String.Compare a String.ToUpper, využívají vlastnost CurrentCulture. Kód provádějící operace s řetězci, které jsou závislé na jazykové verzi, může způsobit chyby zabezpečení, pokud je vlastnost CurrentCulture změněna nebo pokud se jazyková verze v počítači, na kterém kód běží, liší od jazykové verze používané k testování kódu. Chování, které je očekáváno při psaní operace s řetězci, se liší od skutečného chování kódu v počítači, na kterém je vykonáván. Naopak porovnávání podle pořadového čísla závisí výhradně na binární hodnotě porovnávaných znaků.

Operace s řetězci

Pokud aplikace potřebuje provést operace s řetězci zohledňující jazykovou verzi, které nejsou ovlivněny hodnotou CurrentCulture, pak by měla použít metodu, která přijímá parametr CultureInfo. Aplikace by měla tomuto parametru předat hodnotu vlastnosti InvariantCulture. Aplikace by měla tuto vlastnost použít s metodami, jako je například String.Compare a String.ToUpper, pro odstranění rozdílů jazykových verzí a pro zajištění konzistentních výsledků. Další informace o použití vlastnosti InvariantCulture pro provádění operací s řetězci nezávislých na jazykové verzi naleznete v tématu Operace s řetězci nezávislé na jazykové verzi.

Trvalé ukládání dat

Vlastnost InvariantCulture je užitečná pro ukládání dat, která se nezobrazí přímo uživatelům. Ukládání dat ve formátu nezávislém na jazykové verzi zaručuje formát, který je známý a který se nemění. Při přístupu uživatelů s různými jazykovými verzemi mohou být data formátována vhodným způsobem na základě konkrétního uživatele. Například pokud aplikace ukládá typy DateTime v textovém souboru formátovaném pro invariantní jazykovou verzi, pak by měla používat vlastnost InvariantCulture při volání metody ToString pro uložení řetězců a metody Parse pro načtení řetězců. Tento postup zajišťuje, že se odpovídající hodnoty typů DateTime nezmění, když jsou data čtena nebo zapisována uživateli z různými jazykovými verzemi.

Následující příklad kódu ukazuje, jak lze inicializovat instanci objektu CultureInfo s invariantní jazykovou verzí pomocí prázdného řetězce ("") nebo InvariantCulture.

' The following lines are equivalent.
CultureInfo Invc = New CultureInfo("")
CultureInfo Invc = CultureInfo.InvariantCulture
// The following lines are equivalent.
CultureInfo Invc = New CultureInfo("");
CultureInfo Invc = CultureInfo.InvariantCulture;

Následující příklad kódu ukazuje zápis objektu DateTime do souboru jako řetězec formátovaný pro invariantní jazykovou verzi užitím metody ToString. Řetězec je potom přečten ze souboru ve formátu invariantní jazykové verze a je převeden na objekt DateTime pomocí metody Parse. Objekt DateTime je formátován a zobrazen pro jazykové verze "fr-FR" a "ja-JP".

Imports System
Imports System.IO
Imports System.Globalization
Imports Microsoft.VisualBasic

Public Class TextToFile
   Private const FILE_NAME As String = "MyDateFile.txt"   
   
   Public Shared Sub Main()
      If File.Exists(FILE_NAME) Then
         Console.WriteLine("{0} already exists!", FILE_NAME)
         Return
      End If

      Dim sw As StreamWriter = File.CreateText(FILE_NAME)
      
      'Creates a DateTime.
      Dim dtIn As DateTime = DateTime.Now
      Dim InvC As CultureInfo = CultureInfo.InvariantCulture
      ' Writes the string to the file formatted for InvariantCulture.
      sw.WriteLine(dtIn.ToString("d", InvC))
      sw.Close()
      
      If Not File.Exists(FILE_NAME) Then
         Console.WriteLine("{0} does not exist!", FILE_NAME)
         Return
      End If
      
      Dim sr As StreamReader = File.OpenText(FILE_NAME)
      Dim filedate As String
      filedate = sr.Readline()
      While Not filedate Is Nothing
         Console.WriteLine(ControlChars.Newline + "The date stored in _
            the file formatted for the invariant culture is:" + _
            ControlChars.Newline + " {0}", filedate )
         
         ' Creates a new DateTime and parses the 
         ' string stored in the file.
         Dim dtout as DateTime = DateTime.Parse(filedate, InvC)
         
         ' Creates a CultureInfo set to "fr-FR".
         Dim frc As New CultureInfo("fr-FR")
         ' Displays the date formatted for the "fr-FR" culture.
         Console.WriteLine(ControlChars.Newline + "The date read from _
            the file and formatted for the culture ""fr-FR"" is:" + _
            ControlChars.Newline + " {0}", dtout.ToString("d", frc))
         
         ' Creates a CultureInfo set to "ja-JP".
         Dim jpn As New CultureInfo("ja-JP")
         ' Displays the date formatted for the "ja-JP" culture.
         Console.WriteLine(ControlChars.Newline + "The date read from _
            the file and formatted for the culture ""ja-JP"" is:" + _
            ControlChars.Newline + " {0}", dtout.ToString("d", jpn))
        
        filedate = sr.Readline()
      End While
      
      Console.WriteLine(ControlChars.Newline + "The end of the stream _
         has been reached.")
      sr.Close()
   End Sub
End Class
using System;
using System.IO;
using System.Globalization;

public class TextToFile 
{
   private const string FILE_NAME = "MyDateFile.txt";
   public static void Main(String[] args) 
   {
      if (File.Exists(FILE_NAME)) 
      {
         Console.WriteLine("{0} already exists!", FILE_NAME);
         return;
      }
      StreamWriter sw = File.CreateText(FILE_NAME);
      
      // Creates a DateTime.      
      DateTime dtIn = DateTime.Now;
      // Creates a CultureInfo set to InvariantCulture.
      CultureInfo InvC = new CultureInfo("");
      // Converts dt to a string formatted for InvariantCulture,
      // and writes it to a file.
      sw.WriteLine (dtIn.ToString("d",InvC));
      sw.Close();

      if (!File.Exists(FILE_NAME)) 
      {
         Console.WriteLine("{0} does not exist!", FILE_NAME);
         return;
      }
      StreamReader sr = File.OpenText(FILE_NAME);
      String date;
      while ((date=sr.ReadLine())!=null) 
      {
         Console.WriteLine("\nThe date stored in the file formatted for 
               the invariant culture is:\n{0}" , date);    

         // Parses the string stored in the file,
         // and stores it in a DateTime.
         DateTime dtout = DateTime.Parse(date, InvC);

         // Creates a CultureInfo set to "fr-FR".
         CultureInfo frc = new CultureInfo("fr-FR");
         // Displays the date formatted for the "fr-FR" culture.
         Console.WriteLine("\nThe date read from the file and formatted 
               for the culture \"fr-FR\" is:\n{0}" , dtout.ToString("d", 
               frc));

         // Creates a CultureInfo set to "ja-JP".
         CultureInfo jpn= new CultureInfo("ja-JP");
         // Displays the date formatted for the "ja-JP" culture.
         Console.WriteLine("\nThe date read from the file and formatted 
               for the culture \"ja-JP\" is:\n{0}" , dtout.ToString("d", 
               jpn));
      }
      Console.WriteLine ("\nThe end of the stream has been reached.");
      sr.Close();
   }
}

Tento kód vytvoří následující výstup:

The date stored in the file formatted for the invariant culture is:
07/24/2001

The date read from the file and formatted for the culture "fr-FR" is:
24/07/2001

The date read from the file and formatted for the culture "ja-JP" is:
2001/07/24

The end of the stream has been reached.

Viz také

Koncepty

Použití třídy CultureInfo