Utilisation de la propriété InvariantCulture
La propriété InvariantCulture ne représente ni une culture neutre, ni une culture spécifique. Elle représente une culture d'un troisième type pourrait être qualifiée d'indifférente. En effet, la culture invariante est associée à la langue anglaise, mais non à un pays ou à une région. Vos applications peuvent utiliser cette propriété avec quasiment toute méthode dans l'espace de noms System.Globalization qui requiert une culture. Toutefois, une application doit utiliser la culture indifférente uniquement pour les processus qui nécessitent des résultats indépendants de la culture, tels que la mise en forme et l'analyse des données qui sont rendues persistantes pour un fichier. Dans les autres cas, elle produit des résultats qui risquent d'être linguistiquement incorrects ou culturellement inadéquats.
Considérations sur la sécurité
Si une décision de sécurité est prise en fonction du résultat d'une comparaison de chaînes ou modification de la casse, l'application doit utiliser une comparaison ordinale qui ignore le cas au lieu d'utiliser InvariantCulture. Les implémentations par défaut de méthodes telles que String.Compare et String.ToUpper utilisent la propriété CurrentCulture. Le code qui effectue des opérations de chaînes dépendantes de la culture peut provoquer une faille de sécurité si CurrentCulture est modifié ou si la culture paramétrée sur l'ordinateur sur lequel le code est exécuté est différente de celle utilisée pour tester le code. Le comportement que vous attendez lorsque l'écriture d'une opération sur une chaîne diffère du comportement réel de votre code sur l'ordinateur qui l'exécute. Par opposition, une comparaison ordinale dépend uniquement de la valeur binaire des caractères comparés.
Opérations de chaîne
Si votre application doit exécuter une opération sur une chaîne dépendante de la culture qui n'est pas affectée par la valeur de CurrentCulture, elle doit utiliser une méthode qui accepte un paramètre CultureInfo. L'application doit spécifier la valeur de la propriété InvariantCulture pour ce paramètre. L'application doit utiliser la propriété avec les méthodes telles que String.Compare et String.ToUpper pour éliminer les variations culturelles et garantir des résultats cohérents. Pour plus d'informations sur l’utilisation de la propriété InvariantCulture pour effectuer des opérations indépendantes de la culture sur des chaînes, consultez Opérations de chaînes indépendantes de la culture.
Persistance des données
La propriété InvariantCulture est utile pour stocker des données qui ne seront pas affichées directement sur l'ordinateur de l'utilisateur final. Le stockage des données sous une forme indépendante des cultures garantit un format connu, qui ne change pas. Lorsque des utilisateurs de cultures différentes accèdent aux données, celles-ci peuvent être mises en forme de façon appropriée en fonction de l'utilisateur spécifique. Par exemple, si votre application stocke des types DateTime dans un fichier texte mis en forme pour la culture indifférente, l'application doit utiliser la propriété InvariantCulture en appelant ToString pour stocker les chaînes et la méthode Parse pour récupérer les chaînes. Cette technique permet de s'assurer que les valeurs sous-jacentes des types DateTime ne changent pas lorsque les données sont lues ou écrites par des utilisateurs de cultures différentes.
L'exemple de code suivant montre comment initialiser un objet CultureInfo avec la culture dite indifférente à l'aide d'une chaîne vide ("") ou de 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;
L'exemple de code suivant montre comment écrire un objet DateTime dans un fichier sous la forme d'une chaîne mise en forme pour la culture indifférente à l'aide de la méthode ToString. La chaîne est ensuite extraite du fichier sous le format de la culture indifférente et convertie en objet DateTime à l'aide de la méthode Parse. L'objet DateTime est ensuite mis en forme et affiché pour les cultures « fr-FR » et « 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();
}
}
Ce code génère la sortie suivante :
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.