Utilizar la propiedad InvariantCulture

La propiedadCultureInfo.InvariantCulture no es una referencia cultural neutra ni específica. Es un tercer tipo que no tiene en cuenta la referencia cultural. Se encuentra asociada al idioma inglés pero a ningún país o región. Puede utilizar InvariantCulture en casi cualquier método del espacio de nombres System.Globalization que requiera una referencia cultural. No obstante, deberá utilizar la referencia cultural invariable únicamente para los procesos que requieran resultados independientes de la referencia cultural como, por ejemplo, dar formato y analizar los datos que se almacenan en un archivo. En otros casos, produce resultados que pueden ser lingüísticamente incorrectos o culturalmente inapropiados.

Consideraciones de seguridad

Si se va a tomar una decisión de seguridad en función de los resultados de una comparación de cadenas o cambio de mayúsculas y minúsculas, utilice una comparación ordinal que omita el uso de mayúsculas y minúsculas en lugar de utilizar InvariantCulture. Esto se debe a que las implementaciones predeterminadas de métodos como String.Compare, String.ToUpper y String.ToLower utilizan la propiedad CultureInfo.CurrentCulture. El código que realiza operaciones de cadenas que tienen en cuenta las referencias culturales puede provocar puntos vulnerables en la seguridad si se cambia CultureInfo.CurrentCulture, o si la referencia cultural del equipo en el que se ejecuta el código difiere de la referencia cultural utilizada por el programador para probar el código. El comportamiento que espera el programador que escribe una operación de cadena será diferente del comportamiento real del código en el equipo en el que se ejecuta la operación. En cambio, una comparación ordinal depende únicamente del valor binario de los caracteres comparados.

Operaciones de cadena

Si desea realizar una operación de cadena que tenga en cuenta la referencia cultural y que no se vea afectada por el valor de CultureInfo.CurrentCulture, utilice un método que acepte un parámetro CultureInfo, y especifique el valor de la propiedad CultureInfo.InvariantCulture para el parámetro CultureInfo. Utilice InvariantCulture con métodos como String.Compare, String.ToUpper y String.ToLower para eliminar las variaciones de la referencia cultural y garantizar unos resultados coherentes. Para obtener más información sobre el uso de la propiedad InvariantCulture para realizar operaciones de cadena que no tienen en cuenta las referencias culturales, vea Operaciones de cadena que no tienen en cuenta las referencias culturales.

Almacenar datos

La propiedad InvariantCulture resulta útil para almacenar datos que no se van a mostrar directamente a los usuarios finales. Almacenar datos en un formato independiente de la referencia cultural garantiza el uso de un formato conocido que no cambia. Cuando los usuarios de diferentes referencias culturales tienen acceso a los datos, se puede aplicar el formato adecuado según el usuario. Por ejemplo, si almacena tipos DateTime en un archivo de texto, con formato para InvariantCulture, utilice la propiedad InvariantCulture cuando llame al método DateTime.ToString, para almacenar las cadenas, y al método Date.Parse, para recuperarlas. Esto asegurará que los valores subyacentes de los tipos DateTime no cambien cuando los datos sean leídos o escritos por usuarios de referencias culturales diferentes.

En el siguiente ejemplo de código se muestra la forma de inicializar CultureInfo con la referencia cultural invariable mediante el uso de una cadena vacía ("") o de 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;

En el ejemplo de código siguiente se muestra cómo escribir un tipo DateTime en un archivo como cadena con formato para InvariantCulture mediante el método DateTime.ToString. A continuación, se lee la cadena del archivo en el formato InvariantCulture y se analiza para un tipo DateTime mediante el método Date.Parse. Después, se aplica formato a DateTime y se muestra para las referencias culturales "fr-FR" y "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();
   }
}

Este código genera el resultado siguiente:

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.

Vea también

Referencia

CultureInfo Class
CultureInfo.CurrentUICulture Property
CultureInfo.CreateSpecificCulture Method

Otros recursos

Codificación y localización