c# globalization culture cultureinfo currentculture

system globalization c#



¿Cuándo debo especificar CurrentCulture o InvariantCulture y cuándo debo dejarlo sin especificar? (2)

El valor predeterminado ya es la cultura actual inicializada por Windows. Por lo tanto, utilizar CultureInfo.CurrentCulture explícitamente es solo una pérdida de tiempo. Cualquier formato de serialización decente (incluida la serialización binaria y la serialización XML) serializará un DateTime de manera invariable para la cultura.

Usar una cultura que no sea la predeterminada es muy peligroso. Siempre se iniciará un subproceso con la cultura predeterminada especificada por Windows y configurada por el usuario cuando instaló Windows. .NET inicia subprocesos de subprocesos todo el tiempo y te arriesgarás a obtener una cultura en ese hilo que sea diferente de tu hilo principal. Que puede causar todo tipo de problemas sutiles. Como tener una lista ordenada que de repente ya no está ordenada.

¿Cuál es la mejor práctica para especificar CurrentCulture o InvariantCulture y no especificar la cultura en absoluto?

Por lo que he leído, si está haciendo una serialización, por ejemplo, necesita InvariantCulture como medio para especificar una representación canónica de un valor de datos. Eso es un porcentaje relativamente pequeño de manipulaciones de cuerdas basadas en la cultura.

Lo encuentro largo, detallado y feo la mayor parte del tiempo para especificarlo cada vez que lo hago, por ejemplo:

var greeting = string.Format(CultureInfo.CurrentCulture, "Hello ", userName);

Sin embargo, mi equipo recientemente activó FxCop y ahora hay un impulso para usar siempre CultureInfo TODAS PARTES. ¿Cuál es la mejor técnica para combinar brevedad, legibilidad y funcionalidad?

Un buen material de lectura:


Hay una compensación inherente en juego aquí.

Como mínimo, querrá especificar CultureInfo para usar InvariantCulture cada vez que haga algo interno dentro de su programa. Por ejemplo, usar esto con la serialización hace que la representación de los datos sea siempre la misma, por lo que no tiene que preocuparse por los problemas de internacionalización con sus formatos de datos internos.

Dicho esto, especificar esto en todas partes tiene algunas ventajas, principalmente en términos de forzarlo a asegurarse de que está manejando esto correctamente. El trabajo interno del programa frente al trabajo de la interfaz de usuario debe tener una cultura diferente especificada (siempre que desee localizar correctamente su aplicación). Como resultado, un programa complejo tiende a requerir que esto se especifique en todas partes, ya que dejar el "predeterminado" es, en el mejor de los casos, peligroso y tiende a introducir errores con el tiempo.

Sin embargo, especificar esto, como notó, tiende a aumentar el tamaño de su código y, potencialmente, a reducir la legibilidad. Esto lleva a un compromiso: legibilidad y facilidad de mantenimiento a través de un código más corto frente a una adecuada internacionalización y localización y facilidad de mantenimiento a través de ser más explícitos en todas partes.

En mi opinión, no hay una respuesta "correcta" aquí, realmente depende de su aplicación. Si su aplicación es completamente sobre presentación y no está haciendo mucha manipulación de datos, especialmente con ningún tipo de almacenamiento de archivos autogestionado, establecer la cultura actual (y la cultura ui) una vez puede estar bien. He encontrado que las aplicaciones más complicadas tienden a no funcionar tan bien de esta manera, sin embargo, en cuyo caso las sugerencias de FxCop de especificar esto en todas partes parecen más atractivas.