2010-03-11 24 views

Respuesta

103

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 siga siendo el mismo.

Ser capaz de utilizar la misma cultura cada vez es muy importante en varios flujos, por ejemplo, serialización: puede tener 1,1 valor 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 utilizar la cultura invariable 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); 
+8

Por lo que vale, esto está en el espacio de nombres 'System.Globalization'. –

+0

* Esto siempre funcionará porque serializaste con la misma cultura * << esto no tenía sentido para mí, creo que entendí mal algo. Si usa 'CultureInfo.InvariantCulture' funciona porque serializó con la misma cultura ... ¿entonces no es lo mismo que usar' CultureInfo.CurrentCulture'? – Alisson

+1

@Alisson Si vuelve a incluir las dos últimas declaraciones de Andrew en el flujo original, creo que tendrá más sentido. Si siempre serializas utilizando 'CultureInfo.InvariantCulture' entonces sabes que siempre podrás analizar de nuevo a un decimal usando' CultureInfo.InvariantCulture'. Si usa 'CultureInfo.CurrentCulture' para serializar, su usuario podría tener" en-US "como su cultura actual. El siguiente usuario que vaya a analizarlo de nuevo a un decimal puede tener un cultivo actual que use "," para un separador. –

96

Una falsa cultura basada en el inglés con un comportamiento definido. Ideal 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á.

+4

Específicamente, no te sorprenderán los diferentes usos de comas y puntos en las formas de cadena de los números, o con las conversiones de mayúsculas y minúsculas. –

+6

Yesss ... 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. Use Invariant Language allí;) – TomTom

+16

Para agregar al comentario de Steve: es la cultura de usar cuando en realidad no le importa cómo se ven las cosas * (no le importa si usa comas o puntos o lo que sea, porque el usuario nunca lo verá) pero siempre es necesario que sea el mismo (por ejemplo, porque necesita poder leer lo que ha escrito). – itowlson

6

Se utiliza para la materia que es el mismo independientemente de la cultura (que no necesitan ser traducidos a alguna cultura que X sea 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 metiéndose, debe usar InvariantCulture para todos los métodos que incluyan un parámetro de cultivo.

Tenga en cuenta que por las docs enlaces anteriormente:

Sin embargo, una aplicación debe utilizar la cultura invariante sólo para procesos que requieren resultados de los cultivos-independiente, como el formato y los datos de análisis que se conserva en un archivo.

+2

Esto habla del corolario de que la Cultura Invariante solo pretende ser un formato intermedio, es decir, si estás exhibiendo cosas para el usuario que son el resultado de la cultura invariante (es decir, "en" la cultura invariante), eres haciendo algo mal y no entiendo la cultura invariante. – mlhDev

2

La cultura invariante es insensible a la cultura; está asociado con el idioma inglés, pero no con ningún país/región. Puede usar la cultura invariante para operaciones de cadenas sensibles a la cultura que no se ven afectadas por las convenciones de la cultura de hilos actual y que son consistentes en todas las culturas.

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 el formato de las convenciones de la cultura invariante.

diferencia de los datos de cultivo sensibles, que está sujeto a cambios por el usuario personalizar o por las actualizaciones de .NET Framework o el sistema operativo , cultura datos invariante es estable en el tiempo y en todo culturas instalados y no puede ser personalizado por usuarios. Esto hace que el cultural invariable particularmente útil para operaciones que requieren resultados de los cultivos-independiente, como el formato y las operaciones de análisis sintáctico que persisten datos formateados, o clasificar y ordenar operaciones que requieren que los datos se mostrarán en un orden fijo independientemente de la cultura.

La propiedad InvariantCulture es muy útil cuando desea mostrar persisten los datos en un formatoindependiente del cultivo.

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

+0

-1 porque definitivamente no entendería la mayor parte de esta explicación sin haber leído las anteriores. No está claro, en mi opinión, qué * "operaciones de cuerdas sensibles a la cultura que no se ven afectadas por las convenciones de la cultura de hilos actual y que son consistentes en todas las culturas" * están destinadas a ser, y todavía no estoy 100% seguro lo que quiso escribir en la oración después de la cita (* "mostrar datos persistentes" * es claramente un error tipográfico, pero no sé para qué). –

Cuestiones relacionadas