¿Qué es la cultura invariante?

173

¿Alguien podría dar un ejemplo para demostrar el uso de la Cultura Invariante ? No entiendo lo que describe la documentación.

Ricky
fuente
14
Es inglés, pero no está asociado con ninguna ubicación.

Respuestas:

132

La cultura invariante es una cultura especial que es útil porque no cambiará. La cultura actual puede cambiar de un usuario a otro, o incluso de una carrera a otra, por lo que no puede confiar en que se mantenga igual.

Poder usar la misma cultura cada vez es muy importante en varios flujos, por ejemplo, la serialización: puede tener un valor de 1,1 en una cultura y 1,1 en otra. Si intenta analizar el valor "1,1" en la segunda cultura, el análisis fallará. Sin embargo, puede usar la cultura invariante para convertir un número en una cadena y luego analizarlo desde cualquier computadora con cualquier conjunto de cultura.

// Use some non-invariant culture.
CultureInfo nonInvariantCulture = new CultureInfo("en-US");
Thread.CurrentThread.CurrentCulture = nonInvariantCulture;

decimal dec = 1.1m;
string convertedToString = dec.ToString();

// Simulate another culture being used,
// following code can run on another computer.
nonInvariantCulture.NumberFormat.NumberDecimalSeparator = ",";

decimal parsedDec;

try
{
    // This fails because value cannot be parsed.
    parsedDec = decimal.Parse(convertedToString);
}
catch (FormatException)
{
}

// However you always can use Invariant culture:
convertedToString = dec.ToString(CultureInfo.InvariantCulture);

// This will always work because you serialized with the same culture.
parsedDec = decimal.Parse(convertedToString, CultureInfo.InvariantCulture);
Andrew Bezzub
fuente
9
Por lo que vale, esto está en el System.Globalizationespacio de nombres.
Jim H.
1
Esto siempre funcionará porque serializaste con la misma cultura << esto no tenía sentido para mí, creo que entendí mal algo. Si usar CultureInfo.InvariantCulturefunciona porque serializaste con la misma cultura ... ¿no es lo mismo que usar CultureInfo.CurrentCulture?
Alisson
3
@Alisson Si vuelve a poner las últimas dos declaraciones de código de Andrew en el flujo original, creo que tendrá más sentido. Si siempre serializa usando, CultureInfo.InvariantCultureentonces sabe que siempre podrá volver a analizar con un decimal usando CultureInfo.InvariantCulture. Si usa CultureInfo.CurrentCulturepara serializar, su usuario podría tener "en-US" como su cultura actual. El siguiente usuario que vaya a analizarlo de nuevo a un decimal podría tener una cultura actual que use "," para un separador.
David Specht
1
@ Andrew Tal vez soy denso, pero no podía entender lo que estabas diciendo, sin el comentario de David. Edité tu respuesta para que sea explícita.
jpaugh
111

Una cultura falsa basada en el inglés con comportamiento definido. Excelente para escribir, por ejemplo, cosas en archivos de configuración para que puedan leerse y escribirse independientemente de la cultura que el usuario haya definido.

Básicamente es una cultura específica que es artificial y no cambiará .

TomTom
fuente
44
Específicamente, no te sorprenderán los diferentes usos de comas y puntos en las formas de cadena de números, o con conversiones de mayúsculas y minúsculas.
Steve Gilham
8
Sí ... problema típico para: * programadores estadounidenses que piensan que la palabra es inglés;) Y luego los clientes alemanes escriben 1.000,00 por 1000;) Ouch. * Incluso en el mismo idioma, Suiza y Alemania, por ejemplo, usan "." y "," de diferentes maneras en números. Resultado -> Los archivos de configuración son basura. Usar lenguaje invariante allí;)
TomTom
23
Para agregar al comentario de Steve: es la cultura que se debe usar cuando realmente no te importa cómo se ven las cosas (no te importa si usa comas o puntos o lo que sea, porque el usuario nunca lo verá), pero siempre lo necesitas. para ser el mismo (por ejemplo, porque necesita poder leer lo que ha escrito).
itowlson
7

Se usa para cosas que son iguales independientemente de la cultura (que no es necesario traducir a alguna cultura X para ser apropiado)

como por ejemplo: https://msdn.microsoft.com/en-us/library/4c5zdc6a(v=vs.100).aspx . Cuando escribe un archivo específico de la aplicación con el que el usuario no debería estar jugando, debe usar InvariantCulture para todos los métodos que incorporan un parámetro de cultura.

Tenga en cuenta que según los documentos vinculados anteriormente:

Sin embargo, una aplicación debe usar la cultura invariante solo para procesos que requieren resultados independientes de la cultura, como formatear y analizar datos que se conservan en un archivo.

Gishu
fuente
3
Esto habla del corolario de que la Cultura Invariante solo pretende ser un formato intermedio, es decir, si está mostrando cosas al usuario que es el resultado de la cultura invariante (es decir, 'en' la cultura invariante), está haciendo algo mal y no entiendo la cultura invariante.
mlhDev
3

La cultura invariante es insensible a la cultura; está asociado con el idioma inglés pero no con ningún país / región.

CultureInfo.InvariantCulture recupera una instancia de la cultura invariante. Se puede usar en casi cualquier método en el sistema. Espacio de nombres de globalización que requiere una cultura.

Los objetos devueltos por propiedades como CompareInfo, DateTimeFormat y NumberFormat también reflejan la comparación de cadenas y las convenciones de formato de la cultura invariante. La propiedad InvariantCulture es útil cuando desea mostrar datos persistentes en una cultura independiente formato .

Por ejemplo, si desea mostrar un número o una fecha y hora en un formato específico independiente de la cultura actual de la aplicación, puede usar CultureInfo.InvariantCulture .

CharithJ
fuente
0

Es un idioma inglés universal, simple, no regional, específico y otra información relacionada. Es como el lenguaje del lenguaje de programación en sí. Puede confiar en él para configurar un calendario universal; en situaciones en las que necesita generar nombres de controlador, URL, nombres de delegado ... etc. y necesitan cosas para actuar de forma natural y universal entre todos los usuarios.

Shadi Namrouti
fuente