Propiedad System.Globalization.CultureInfo.InvariantCulture

En este artículo se proporcionan comentarios adicionales a la documentación de referencia de esta API.

La referencia cultural invariable no distingue la referencia cultural; está asociado al idioma inglés, pero no a ningún país o región. Especifique la referencia cultural invariable por nombre mediante una cadena vacía ("") en la llamada a un CultureInfo método de creación de instancias. Esta propiedad, CultureInfo.InvariantCulture, también recupera una instancia de la referencia cultural invariable. Se puede usar en casi cualquier método del System.Globalization espacio de nombres que requiera una referencia cultural. Los objetos devueltos por propiedades como CompareInfo, DateTimeFormaty NumberFormat también reflejan las convenciones de comparación de cadenas y formato de la referencia cultural invariable.

A diferencia de los datos confidenciales de la referencia cultural, que están sujetos a cambios por personalización de usuario o por actualizaciones de .NET Framework o el sistema operativo, los datos de referencia cultural invariable son estables a lo largo del tiempo y entre las referencias culturales instaladas y los usuarios no pueden personalizarlos. Esto hace que la referencia cultural invariable sea especialmente útil para las operaciones que requieren resultados independientes de la referencia cultural, como las operaciones de formato y análisis que conservan los datos con formato, o las operaciones de ordenación y ordenación que requieren que los datos se muestren en un orden fijo, independientemente de la referencia cultural.

Operaciones de cadena

Puede usar la referencia cultural invariable para las operaciones de cadena sensibles a la referencia cultural que no se ven afectadas por las convenciones de la referencia cultural actual y que son coherentes entre referencias culturales. Por ejemplo, puede que desee que los datos ordenados aparezcan en un orden fijo o apliquen un conjunto estándar de convenciones de mayúsculas y minúsculas a cadenas independientemente de la referencia cultural actual. Para ello, pase el InvariantCulture objeto a un método que tenga un CultureInfo parámetro, como Compare(String, String, Boolean, CultureInfo) y ToUpper(CultureInfo).

Conservación de datos

La InvariantCulture propiedad se puede usar para conservar los datos en un formato independiente de la referencia cultural. Esto proporciona un formato conocido que no cambia y que se puede usar para serializar y deserializar datos entre referencias culturales. Después de deserializar los datos, se puede formatear adecuadamente en función de las convenciones culturales del usuario actual.

Por ejemplo, si decide conservar los datos de fecha y hora en forma de cadena, puede pasar el InvariantCulture objeto al DateTime.ToString(String, IFormatProvider) método o DateTimeOffset.ToString(IFormatProvider) para crear la cadena, y puede pasar el InvariantCulture objeto al DateTime.Parse(String, IFormatProvider) método o DateTimeOffset.Parse(String, IFormatProvider, DateTimeStyles) para convertir la cadena en un valor de fecha y hora. Esta técnica garantiza que los valores de fecha y hora subyacentes no cambien cuando los usuarios lean o escriban los datos de diferentes referencias culturales.

En el ejemplo siguiente se usa la referencia cultural invariable para conservar un DateTime valor como una cadena. A continuación, analiza la cadena y muestra su valor mediante las convenciones de formato de las referencias culturales francés (Francia) y alemán (Alemania).

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

Decisiones de seguridad

Si va a tomar una decisión de seguridad (por ejemplo, si se permite el acceso a un recurso del sistema) en función del resultado de una comparación de cadenas o un cambio de caso, no debe usar la referencia cultural invariable. En su lugar, debe realizar una comparación ordinal sin distinción entre mayúsculas y minúsculas mediante una llamada a un método que incluya un StringComparison parámetro y proporcione o StringComparison.OrdinalIgnoreCaseStringComparison.Ordinal como argumento. El código que realiza operaciones de cadena que distinguen referencias culturales puede provocar vulnerabilidades de seguridad si se cambia la referencia cultural actual o si la referencia cultural del equipo que ejecuta el código difiere de la referencia cultural que se usa para probar el código. Por el contrario, una comparación ordinal depende únicamente del valor binario de los caracteres comparados.