Verwenden der InvariantCulture-Eigenschaft

Die InvariantCulture-Eigenschaft stellt weder eine neutrale noch eine bestimmte Kultur dar. Es handelt sich um einen dritten Kulturtyp, der kulturunabhängig ist. Die Eigenschaft ist mit der englischen Sprache verknüpft. Eine Verknüpfung mit einem Land oder einer Region besteht jedoch nicht. Die Anwendungen können diese Eigenschaft mit nahezu allen Methoden im System.Globalization-Namespace verwenden, die eine Kultur benötigen. Eine Anwendung sollte die invariante Kultur jedoch nur für Verfahren verwenden, für die kulturunabhängige Ergebnisse benötigt werden, beispielsweise das Formatieren und Analysieren von Daten, die in einer Datei gespeichert werden. Anderenfalls werden möglicherweise sprachlich falsche oder kulturell unangemessene Ergebnisse erzeugt.

Sicherheitsüberlegungen

Wenn eine Sicherheitsentscheidung basierend auf dem Ergebnis eines Zeichenfolgenvergleichs oder einer Änderung der Groß-/Kleinschreibung getroffen wird, sollte die Anwendung anstelle von InvariantCulture einen Ordinalvergleich verwenden, bei dem die Groß-/Kleinschreibung ignoriert wird. Die Standardimplementierungen von Methoden wie String.Compare und String.ToUpper verwenden die CurrentCulture-Eigenschaft. Code, mit dem kulturabhängige Zeichenfolgenoperationen durchgeführt werden, kann Sicherheitslücken zur Folge haben, wenn CurrentCulture geändert wird oder sich die Kultur des Computers, auf dem der Code ausgeführt wird, von der Kultur unterscheidet, die zum Testen des Codes verwendet wurde. Das Verhalten, dass Sie beim Schreiben einer Zeichenfolgenoperation erwarten, unterscheidet sich vom tatsächlichen Verhalten des Codes auf dem Computer, auf dem er ausgeführt wird. Im Gegensatz dazu hängt ein Ordinalvergleich lediglich vom Binärwert der verglichenen Zeichen ab.

Zeichenfolgenoperationen

Wenn die Anwendung eine kulturabhängige Zeichenfolgenoperation durchführen muss, die durch den Wert von CurrentCulture nicht beeinflusst wird, sollte eine Methode verwendet werden, die einen CultureInfo-Parameter akzeptiert. Die Anwendung sollte den Wert der InvariantCulture-Eigenschaft für diesen Parameter angeben. Außerdem sollte die Anwendung die Eigenschaft mit Methoden wie String.Compare und String.ToUpper verwenden, um kulturelle Variationen auszuschließen und konsistente Ergebnisse zu gewährleisten. Weitere Informationen zur Verwendung der InvariantCulture-Eigenschaft für kulturunabhängige Operationen finden Sie unter Kulturunabhängige Zeichenfolgenoperationen.

Beibehalten von Daten

Die InvariantCulture-Eigenschaft ist vor allem zum Speichern von Daten geeignet, die den Benutzern nicht direkt angezeigt werden. Das Speichern von Daten in einem kulturunabhängigen Format gewährleistet ein bekanntes Format, das sich nicht ändert. Wenn Benutzer aus unterschiedlichen Kulturen auf die Daten zugreifen, können diese für die jeweiligen Benutzer entsprechend formatiert werden. Wenn die Anwendung beispielsweise DateTime-Typen in einer Textdatei mit dem Format für die invariante Kultur speichert, sollte die InvariantCulture-Eigenschaft mit der ToString-Methode verwendet werden, um die Zeichenfolgen zu speichern, und mit der Parse-Methode, um die Zeichenfolgen abzurufen. Dadurch wird sichergestellt, dass die zugrunde liegenden DateTime-Typen sich nicht ändern, wenn die Daten von Benutzern verschiedener Kulturen gelesen oder geschrieben werden.

Im folgenden Beispiel wird die Initialisierung eines CultureInfo-Objekts mit der invarianten Kultur veranschaulicht, wobei eine leere Zeichenfolge ("") bzw. InvariantCulture verwendet wird.

' 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;

Im folgenden Codebeispiel wird gezeigt, wie ein DateTime-Objekt mit der ToString-Methode als eine für die invariante Kultur formatierte Zeichenfolge in eine Datei geschrieben wird. Anschließend wird die Zeichenfolge aus der Datei im Format der invarianten Kultur gelesen und mit der Parse-Methode zur Analyse an ein DateTime-Objekt übergeben. Das DateTime-Objekt wird daraufhin für die Kulturen "fr-FR" und "ja-JP" formatiert und angezeigt.

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();
   }
}

Dieser Code erzeugt die folgende Ausgabe:

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.

Siehe auch

Konzepte

Verwenden der CultureInfo-Klasse