Uso della proprietà InvariantCulture
Aggiornamento: novembre 2007
La proprietà InvariantCulture non rappresenta né impostazioni cultura non associate ad alcun paese né impostazioni cultura specifiche. Si tratta di un terzo tipo indipendente dalle impostazioni cultura. È associata alla lingua inglese, ma non a un paese. Tale proprietà può essere utilizzata con quasi tutti i metodi dello spazio dei nomi System.Globalization che richiedono impostazioni cultura. Si consiglia tuttavia di utilizzare la lingua inglese soltanto per i processi che richiedono risultati indipendenti dalle impostazioni cultura, ad esempio per la formattazione e l'analisi dei dati mantenuti in un file. Negli altri casi i risultati prodotti potrebbero non essere corretti dal punto di vista linguistico o non appropriati dal punto di vista della cultura.
Considerazioni sulla protezione
Per decisioni relative alla sicurezza basate sul risultato di un confronto di stringhe o di una modifica di maiuscole e minuscole, l'applicazione deve utilizzare un confronto ordinale in cui viene ignorata la distinzione tra maiuscole e minuscole anziché utilizzare la proprietà InvariantCulture, Le implementazioni predefinite di metodi quali Compare() e ToUpper utilizzano la proprietà CurrentCulture. Se la proprietà CurrentCulture viene modificata oppure le impostazioni cultura del computer in cui viene eseguito il codice non corrispondono a quelle utilizzate per i test del codice, il codice che esegue operazioni sulle stringhe dipendenti dalle impostazioni cultura può causare vulnerabilità a livello di sicurezza. Il comportamento previsto nella scrittura di un'operazione sulle stringhe è diverso dal comportamento effettivo del codice nel computer in cui è in corso l'esecuzione. Al contrario, un confronto basato su ordinale dipende unicamente dal valore binario dei caratteri confrontati.
Operazioni su stringhe
Se è necessario eseguire un'operazione sulle stringhe dipendente dalle impostazioni cultura sulla quale non influisce il valore dell'oggetto CurrentCulture, l'applicazione deve utilizzare un metodo che accetta il parametro CultureInfo. Deve essere specificato il valore della proprietà InvariantCulture per questo parametro. L'applicazione deve utilizzare la proprietà con metodi quali Compare() e ToUpper per eliminare le variazioni determinate dalle impostazioni cultura e garantire risultati coerenti. Per ulteriori informazioni sull'utilizzo della proprietà InvariantCulture per l'esecuzione di operazioni sulle stringhe indipendenti dalle impostazioni cultura, vedere Operazioni sulle stringhe indipendenti dalle impostazioni cultura.
Archiviazione dei dati
La proprietà InvariantCulture è utile per l'archiviazione dei dati che non verranno visualizzati direttamente dagli utenti. L'archiviazione dei dati in un formato indipendente dalle impostazioni cultura garantisce l'uso di un formato noto invariabile. Quando gli utenti di impostazioni cultura differenti accedono ai dati, questi possono essere formattati in modo appropriato in base all'utente specifico. Se, ad esempio, l'applicazione archivia i tipi DateTime in un file di testo formattato per la lingua inglese, l'applicazione deve utilizzare la proprietà InvariantCulture nella chiamata a ToString per l'archiviazione delle stringhe e il metodo Parse per il loro recupero. In questo modo i valori sottostanti dei tipi DateTime rimangono immutati quando i dati vengono letti o scritti da utenti con impostazioni cultura differenti.
Nell'esempio di codice riportato di seguito viene illustrato come inizializzare un oggetto CultureInfo con la lingua inglese utilizzando una stringa vuota ("") oppure 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;
Nell'esempio di codice riportato di seguito viene illustrata la scrittura di un oggetto DateTime in un file come stringa formattata per la lingua inglese utilizzando il metodo ToString. La stringa viene quindi letta dal file nel formato corrispondente alla lingua inglese e analizzata in un oggetto DateTime utilizzando il metodo Parse. L'oggetto DateTime viene quindi formattato e visualizzato per le impostazioni cultura "fr-FR" e "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();
}
}
L'output del codice è il seguente:
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.