Condividi tramite


Uso della proprietà InvariantCulture

La proprietà CultureInfo.InvariantCulture non rappresenta né una lingua non associata ad alcun paese né una lingua specifica. Si tratta di un terzo tipo di lingua invariabile. È associata alla lingua inglese, ma non a un paese. È possibile utilizzare InvariantCulture in quasi tutti i metodi dello spazio dei nomi System.Globalization che richiedono una lingua. Si consiglia tuttavia di utilizzare questa proprietà solo per i processi che richiedono risultati indipendenti dalla lingua, ad esempio per la formattazione e l'analisi dei dati resi persistenti 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

Se viene presa una decisione relativa alla protezione in base al risultato di un confronto di stringhe o di una modifica di maiuscole e minuscole, eseguire un confronto basato su ordinale, in cui viene ignorata la distinzione tra maiuscole e minuscole, anziché utilizzare InvariantCulture, poiché nelle implementazioni predefinite di metodi quali String.Compare, String.ToUpper e String.ToLower viene utilizzata la proprietà CultureInfo.CurrentCulture. La presenza nel codice di operazioni sulle stringhe dipendenti dalla lingua può causare vulnerabilità a livello di protezione se la proprietà CultureInfo.CurrentCulture viene modificata oppure se la lingua nel computer su cui viene eseguito il codice non corrisponde a quella utilizzata dallo sviluppatore per i test del codice. Il comportamento effettivo del codice nel computer su cui viene eseguita un'operazione sulle stringhe risulterà diverso dal comportamento previsto dallo sviluppatore da cui è stata scritta l'operazione. Al contrario, un confronto basato su ordinale dipende unicamente dal valore binario dei caratteri confrontati.

Operazioni su stringhe

Se si desidera eseguire un'operazione su stringhe indipendenti dalla lingua, sulla quale non influisce il valore di CultureInfo.CurrentCulture, utilizzare un metodo che accetta un parametro CultureInfo, specificando il valore della proprietà CultureInfo.InvariantCulture per il parametro CultureInfo. Utilizzare InvariantCulture con metodi quali String.Compare, String.ToUpper e String.ToLower per eliminare le variazioni determinate dalla lingua e garantire risultati coerenti. Per ulteriori informazioni sull'utilizzo della proprietà InvariantCulture per l'esecuzione di operazioni sulle stringhe indipendenti dalla lingua, vedere Operazioni sulle stringhe indipendenti dalla lingua.

Archiviazione dei dati

La proprietà InvariantCulture è utile per l'archiviazione dei dati che non verranno visualizzati direttamente dagli utenti finali. L'archiviazione dei dati in un formato indipendente dalla lingua garantisce l'uso di un formato noto invariabile. Quando gli utenti di lingue differenti accedono ai dati, tali dati possono essere formattati in modo appropriato in base all'utente. Se, ad esempio, si archiviano i tipi DateTime in un file di testo formattato per InvariantCulture, utilizzare la proprietà InvariantCulture quando si chiama il metodo DateTime.ToString per archiviare le stringhe e il metodo Date.Parse per recuperarle. In questo modo i valori sottostanti dei tipi DateTime non cambiano quando i dati vengono letti o scritti da utenti di lingue differenti.

Nell'esempio di codice riportato di seguito viene illustrato come inizializzare CultureInfo con la lingua inglese invariabile utilizzando una stringa vuota ("") oppure CultureInfo.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 DateTime in un file come stringa formattata per InvariantCulture utilizzando il metodo DateTime.ToString. La stringa viene quindi letta dal file nel formato InvariantCulture e analizzata come tipo DateTime utilizzando il metodo Date.Parse. Il tipo DateTime viene quindi formattato e visualizzato per le lingue "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.

Vedere anche

Riferimenti

CultureInfo Class
CultureInfo.CurrentUICulture Property
CultureInfo.CreateSpecificCulture Method

Altre risorse

Codifica e localizzazione