Proprietà System.Globalization.CultureInfo.InvariantCulture
Questo articolo fornisce osservazioni supplementari alla documentazione di riferimento per questa API.
La cultura invariante è insensibile alle differenze culturali; è associata alla lingua inglese, ma non a nessun paese o regione. Specifica la cultura invariante per nome utilizzando una stringa vuota ("") nella chiamata a un metodo di istanziazione CultureInfo. Questa proprietà, CultureInfo.InvariantCulture, recupera anche un'istanza della cultura invariabile. Può essere usato in quasi tutti i metodi nello spazio dei nomi System.Globalization che richiedono una cultura. Gli oggetti restituiti da proprietà come CompareInfo, DateTimeFormat e NumberFormat riflettono anche il confronto delle stringhe e le convenzioni di formattazione della cultura invariante.
A differenza dei dati relativi alla cultura, che possono essere modificati dalla personalizzazione dell'utente o dagli aggiornamenti del .NET Framework o del sistema operativo, i dati di cultura invariante sono stabili nel tempo e tra le culture installate e non possono essere personalizzati dagli utenti. Ciò rende particolarmente utile la cultura invariante per le operazioni che richiedono risultati indipendenti dalla cultura, ad esempio operazioni di formattazione e interpretazione che rendono persistenti i dati formattati o operazioni di ordinamento e classificazione che richiedono la visualizzazione dei dati in un ordine fisso indipendentemente dalla cultura.
Operazioni su stringhe
È possibile usare la cultura invariante per le operazioni di stringa sensibili alla cultura che non sono influenzate dalle convenzioni della cultura corrente e che sono coerenti tra le culture. Ad esempio, potresti volere che i dati ordinati appaiano in un ordine fisso o applicare un insieme standard di convenzioni di maiuscole e minuscole alle stringhe indipendentemente dalla cultura attuale. A tale scopo, passare l'oggetto InvariantCulture a un metodo con un CultureInfo parametro, ad esempio Compare(String, String, Boolean, CultureInfo) e ToUpper(CultureInfo).
Salvataggio permanente dei dati
La InvariantCulture proprietà può essere utilizzata per rendere persistenti i dati in un formato indipendente dalle impostazioni culturali. In questo modo viene fornito un formato noto che non cambia e che può essere usato per serializzare e deserializzare i dati tra culture diverse. Dopo la deserializzazione, i dati possono essere formattati in modo appropriato in base alle convenzioni culturali dell'utente corrente.
Ad esempio, se si sceglie di rendere persistenti i dati di data e ora in formato stringa, è possibile passare l'oggetto InvariantCulture al DateTime.ToString(String, IFormatProvider) metodo o DateTimeOffset.ToString(IFormatProvider) per creare la stringa e passare l'oggetto InvariantCulture al DateTime.Parse(String, IFormatProvider) metodo o DateTimeOffset.Parse(String, IFormatProvider, DateTimeStyles) per convertire la stringa in un valore di data e ora. Questa tecnica garantisce che i valori di data e ora sottostanti non cambino quando i dati vengono letti o scritti dagli utenti di culture diverse.
Nell'esempio seguente si utilizza la cultura invariata per salvare un valore DateTime come stringa. Analizza quindi la stringa e ne visualizza il valore usando le convenzioni di formattazione delle impostazioni cultura francese (Francia) e Tedesco (Germania).
using System;
using System.IO;
using System.Globalization;
public class Example
{
public static void Main()
{
// Persist the date and time data.
StreamWriter sw = new StreamWriter(@".\DateData.dat");
// Create a DateTime value.
DateTime dtIn = DateTime.Now;
// Retrieve a CultureInfo object.
CultureInfo invC = CultureInfo.InvariantCulture;
// Convert the date to a string and write it to a file.
sw.WriteLine(dtIn.ToString("r", invC));
sw.Close();
// Restore the date and time data.
StreamReader sr = new StreamReader(@".\DateData.dat");
String input;
while ((input = sr.ReadLine()) != null)
{
Console.WriteLine($"Stored data: {input}\n");
// Parse the stored string.
DateTime dtOut = DateTime.Parse(input, invC, DateTimeStyles.RoundtripKind);
// Create a French (France) CultureInfo object.
CultureInfo frFr = new CultureInfo("fr-FR");
// Displays the date formatted for the "fr-FR" culture.
Console.WriteLine($"Date formatted for the {frFr.Name} culture: {dtOut.ToString("f", frFr)}");
// Creates a German (Germany) CultureInfo object.
CultureInfo deDe= new CultureInfo("de-De");
// Displays the date formatted for the "de-DE" culture.
Console.WriteLine($"Date formatted for {deDe.Name} culture: {dtOut.ToString("f", deDe)}");
}
sr.Close();
}
}
// The example displays the following output:
// Stored data: Tue, 15 May 2012 16:34:16 GMT
//
// Date formatted for the fr-FR culture: mardi 15 mai 2012 16:34
// Date formatted for de-DE culture: Dienstag, 15. Mai 2012 16:34
Imports System.Globalization
Imports System.IO
Module Example
Public Sub Main()
' Persist the date and time data.
Dim sw As New StreamWriter(".\DateData.dat")
' Create a DateTime value.
Dim dtIn As DateTime = DateTime.Now
' Retrieve a CultureInfo object.
Dim invC As CultureInfo = CultureInfo.InvariantCulture
' Convert the date to a string and write it to a file.
sw.WriteLine(dtIn.ToString("r", invC))
sw.Close()
' Restore the date and time data.
Dim sr As New StreamReader(".\DateData.dat")
Dim input As String = String.Empty
Do While sr.Peek() >= 0
input = sr.ReadLine()
Console.WriteLine("Stored data: {0}" , input)
Console.WriteLine()
' Parse the stored string.
Dim dtOut As DateTime = DateTime.Parse(input, invC, DateTimeStyles.RoundtripKind)
' Create a French (France) CultureInfo object.
Dim frFr As New CultureInfo("fr-FR")
' Displays the date formatted for the "fr-FR" culture.
Console.WriteLine("Date formatted for the {0} culture: {1}" ,
frFr.Name, dtOut.ToString("f", frFr))
' Creates a German (Germany) CultureInfo object.
Dim deDe As New CultureInfo("de-De")
' Displays the date formatted for the "de-DE" culture.
Console.WriteLine("Date formatted for {0} culture: {1}" ,
deDe.Name, dtOut.ToString("f", deDe))
Loop
sr.Close()
End Sub
End Module
' The example displays the following output:
' Stored data: Tue, 15 May 2012 16:34:16 GMT
'
' Date formatted for the fr-FR culture: mardi 15 mai 2012 16:34
' Date formatted for de-DE culture: Dienstag, 15. Mai 2012 16:34
Decisioni relative alla sicurezza
Se si sta prendendo una decisione di sicurezza (ad esempio se consentire l'accesso a una risorsa di sistema) in base al risultato di un confronto tra stringhe o una modifica di maiuscole/minuscole, non è consigliabile usare la cultura invariata. È invece necessario eseguire un confronto ordinale con distinzione tra maiuscole e minuscole o senza distinzione tra maiuscole e minuscole chiamando un metodo che include un StringComparison parametro e specificando StringComparison.Ordinal o StringComparison.OrdinalIgnoreCase come argomento. Il codice che esegue operazioni su stringhe sensibili alla cultura può causare vulnerabilità di sicurezza se la cultura corrente viene modificata o se la cultura sul computer che esegue il codice differisce da quella utilizzata per testare il codice. Al contrario, un confronto ordinale dipende esclusivamente dal valore binario dei caratteri confrontati.