2010-07-12 11 views
19

¿Cuál es la mejor práctica para especificar CurrentCulture o InvariantCulture y no especificar la cultura en absoluto?¿Cuándo debería especificar CurrentCulture o InvariantCulture y cuándo debo dejarlo sin especificar?

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

se me hace largo, prolijo, y feo mayoría de las veces para especificar que cada vez que lo hacemos, decimos:

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

Sin embargo, mi equipo acaba de cumplir FxCop en y ahora hay un empuje para utilizar siempre CultureInfo POR TODAS PARTES. ¿Cuál es la mejor técnica para combinar brevedad, legibilidad y funcionalidad?

buen material de lectura:

Respuesta

16

Hay un equilibrio inherente a 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 Serialización obliga a 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 obligarlo a asegurarse de que está manejando esto correctamente. El trabajo del programa interno frente al trabajo de la interfaz de usuario debe tener una cultura diferente especificada (siempre que desee localizar adecuadamente su aplicación). Como resultado, un programa complejo tiende a requerir que esto se especifique en todas partes, ya que dejar el "valor predeterminado" es peligroso en el mejor de los casos, y tiende a introducir errores a lo largo del tiempo.

Sin embargo, especificar esto, como ha notado, tiende a aumentar el tamaño de su código, y potencialmente reducir la legibilidad. Esto conduce a la compensación: legibilidad y mantenibilidad a través de un código más corto contra una internacionalización y localización adecuadas y mantenibilidad a través de ser más explícito 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 hace mucha manipulación de datos, especialmente no con ningún tipo de almacenamiento de archivos autoadministrado, la configuración de la cultura actual (y cultura de ui) una vez puede estar bien. He descubierto 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.

+1

@Reed Copsey: También he encontrado que agregarlo a todas partes como reflejo de FxCop crea errores: varias veces he visto casos en los que se ha especificado una opción de cultivo incorrecta. Esto es obviamente solo un problema de educación, pero es algo común cuando algo como FxCop te dice que hagas cosas pero no necesariamente entiendes por qué. –

+2

@Scott: cierto. Pero este es el caso con todo en la programación: si vas a usarlo, necesitas entenderlo o te morderá. La única manera sensata de hacer la localización es considerarla cuando escribe el código por primera vez: localizar un producto completo es uno de los peores trabajos y un orden de magnitud más costoso que pensarlo desde el principio. –

+0

No estoy de acuerdo. ¿Colocaría la cultura en todos los ToString() de mis clases? Creo que la lógica y los objetos deberían ignorar la cultura. – onof

5

El valor predeterminado ya es la cultura actual iniciada por Windows. Entonces, usar CultureInfo.CurrentCulture explícitamente es solo una pérdida de tiempo. Cualquier formato de serialización decente (incluyendo serialización binaria y serialización XML) serializará un DateTime de una manera invariante de cultura.

Usar una cultura que no sea la predeterminada es muy peligroso. Siempre se iniciará un subproceso con la cultura predeterminada según lo especificado por Windows y configurado por el usuario cuando instaló Windows. .NET inicia hilos de threadpool 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 SortedList que de repente ya no está ordenada.

Cuestiones relacionadas