Utilizar la propiedad InvariantCulture

La propiedad InvariantCulture no representa una referencia cultural neutra ni específica. Representa 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. Sus aplicaciones pueden utilizar esta propiedad con casi todos los métodos del espacio de nombres System.Globalization que requieren una referencia cultural. No obstante, una aplicación 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, la aplicación debe utilizar una comparación ordinal que omita el uso de mayúsculas y minúsculas en lugar de utilizar InvariantCulture. Las implementaciones predeterminadas de métodos como String.Compare y String.ToUpper utilizan la propiedad 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 CurrentCulture, o si la referencia cultural del equipo en el que se ejecuta el código difiere de la referencia cultural utilizada por para probar el código. El comportamiento que se espera cuando se escribe una operación de cadena difiere del comportamiento real del código en el equipo donde se ejecuta. En cambio, una comparación ordinal depende únicamente del valor binario de los caracteres comparados.

Operaciones de cadena

Si su aplicación necesita realizar una operación de cadena que tiene en cuenta la referencia cultural y que no resulta afectada por el valor de CurrentCulture, debe utilizar un método que acepta un parámetro CultureInfo. La aplicación debe especificar el valor de la propiedad InvariantCulture para este parámetro. La aplicación debe utilizar la propiedad con métodos como String.Compare y String.ToUpper para eliminar las variaciones de referencias culturales y asegurar que los resultados sean coherentes. Para obtener más información sobre cómo utilizar la propiedad InvariantCulture para realizar operaciones que no tienen en cuenta las referencias culturales, vea Operaciones de cadena que no distinguen entre referencias culturales.

Almacenar datos

La propiedad InvariantCulture resulta útil para almacenar datos que no se van a mostrar directamente a los usuarios. 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 su aplicación almacena los tipos DateTime en un archivo de texto con el formato de la referencia cultural invariable, la aplicación debe utilizar la propiedad InvariantCulture al llamar a ToString para almacenar las cadenas, y al método Parse para recuperar las cadenas. Esta técnica asegura que los valores subyacentes de los tipos DateTime no cambiarán 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 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 objeto DateTime en un archivo como una cadena con formato para la referencia cultural invariable utilizando el método ToString. A continuación, se lee la cadena del archivo con el formato de la referencia cultural invariable y se analiza en un objeto DateTime usando el método Parse. Después, se aplica formato al objeto 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

Conceptos

Utilizar la clase CultureInfo