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.