Proprietà System.Globalization.CultureInfo.InvariantCulture

Questo articolo fornisce osservazioni supplementari alla documentazione di riferimento per questa API.

La cultura invariante è senza distinzione tra le impostazioni cultura; è associato alla lingua inglese, ma non a nessun paese o area geografica. Specificare le impostazioni cultura invarianti in base al nome usando una stringa vuota ("") nella chiamata a un CultureInfo metodo di creazione di istanze. Questa proprietà, CultureInfo.InvariantCulture, recupera anche un'istanza delle impostazioni cultura invarianti. Può essere usato in quasi tutti i metodi nello System.Globalization spazio dei nomi che richiede impostazioni cultura. Gli oggetti restituiti da proprietà come CompareInfo, DateTimeFormate NumberFormat riflettono anche il confronto delle stringhe e le convenzioni di formattazione delle impostazioni cultura invarianti.

A differenza dei dati sensibili alle impostazioni cultura, soggetti a modifiche in base alla personalizzazione dell'utente o agli aggiornamenti di .NET Framework o del sistema operativo, i dati delle impostazioni cultura invarianti sono stabili nel tempo e nelle impostazioni cultura installate e non possono essere personalizzati dagli utenti. Ciò rende particolarmente utili le impostazioni cultura invarianti per le operazioni che richiedono risultati indipendenti dalle impostazioni cultura, ad esempio operazioni di formattazione e analisi che rendono persistenti i dati formattati o operazioni di ordinamento e ordinamento che richiedono la visualizzazione dei dati in un ordine fisso indipendentemente dalle impostazioni cultura.

Operazioni con stringhe

È possibile usare le impostazioni cultura invarianti per le operazioni di stringa sensibili alle impostazioni cultura che non sono interessate dalle convenzioni delle impostazioni cultura correnti e coerenti tra le impostazioni cultura. Ad esempio, è possibile che i dati ordinati vengano visualizzati in un ordine fisso o applichino un set standard di convenzioni di maiuscole e minuscole alle stringhe indipendentemente dalle impostazioni cultura correnti. 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 cultura. In questo modo viene fornito un formato noto che non cambia e che può essere usato per serializzare e deserializzare i dati tra le impostazioni cultura. 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 da impostazioni cultura diverse.

Nell'esempio seguente vengono utilizzate le impostazioni cultura invarianti per rendere persistente un DateTime valore 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: {0}\n" , input);

         // 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 {0} culture: {1}" ,
                           frFr.Name, 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 {0} culture: {1}" ,
                           deDe.Name, 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 del caso, non è consigliabile usare le impostazioni cultura invarianti. È 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 di stringa sensibili alle impostazioni cultura può causare vulnerabilità di sicurezza se le impostazioni cultura correnti vengono modificate o se le impostazioni cultura nel computer che esegue il codice differiscono dalle impostazioni cultura usate per testare il codice. Al contrario, un confronto ordinale dipende esclusivamente dal valore binario dei caratteri confrontati.