CultureInfo.InvariantCulture Propiedad
Definición
Importante
Parte de la información hace referencia a la versión preliminar del producto, que puede haberse modificado sustancialmente antes de lanzar la versión definitiva. Microsoft no otorga ninguna garantía, explícita o implícita, con respecto a la información proporcionada aquí.
Obtiene el CultureInfo objeto independiente de la referencia cultural (invariable).
public:
static property System::Globalization::CultureInfo ^ InvariantCulture { System::Globalization::CultureInfo ^ get(); };
public static System.Globalization.CultureInfo InvariantCulture { get; }
static member InvariantCulture : System.Globalization.CultureInfo
Public Shared ReadOnly Property InvariantCulture As CultureInfo
Valor de propiedad
Objeto independiente de la referencia cultural (invariable).
Comentarios
La cultura invariable es insensible a la cultura; está asociada con el idioma inglés, pero no con ningún país o región. Se especifica la referencia cultural invariable por nombre mediante una cadena vacía ("") en la llamada a un método de instanciación CultureInfo. Esta propiedad, CultureInfo.InvariantCulture, también recupera una instancia de la cultura invariable. Se puede usar en casi cualquier método del espacio de nombres System.Globalization que requiera una referencia cultural. Los objetos devueltos por propiedades como CompareInfo, DateTimeFormat y 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 del usuario o por actualizaciones de .NET 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 cultura inmutable sea especialmente útil para las operaciones que requieren resultados independientes de la cultura, como las operaciones de formato y análisis para preservar datos formateados, o las operaciones de ordenamiento que requieren que los datos se muestren en un orden fijo, independientemente de la cultura.
Operaciones de cadena de caracteres
Puede utilizar la cultura invariante para operaciones de cadena sensibles a la cultura que no se vean afectadas por las convenciones de la cultura actual y que sean consistentes entre culturas. Por ejemplo, es posible que desee que los datos ordenados aparezcan en un orden fijo o aplicar un conjunto estándar de convenciones de mayúsculas y minúsculas a las cadenas independientemente de la cultura 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 cultura invariable para conservar el valor DateTime como una cadena. A continuación, analiza la cadena y muestra su valor usando las convenciones de formato de las culturas francesa (Francia) y alemana (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: {input}\n");
// 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 {frFr.Name} culture: {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 {deDe.Name} culture: {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 está tomando una decisión de seguridad (como permitir o no el acceso a un recurso del sistema) basada en el resultado de una comparación de cadenas o un cambio de mayúsculas y minúsculas, no debe utilizar la cultura invariante. En su lugar, debe realizar una comparación ordinal sensible a mayúsculas o minúsculas llamando a un método que incluya un parámetro StringComparison y suministrando StringComparison.Ordinal o StringComparison.OrdinalIgnoreCase como argumento. El código que realiza operaciones de cadena que son sensibles a la cultura puede causar vulnerabilidades de seguridad si se cambia la configuración cultural actual o si la configuración cultural del equipo que ejecuta el código difiere de la configuración 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.