2010-07-12 36 views
19

Quelle est la meilleure pratique pour spécifier CurrentCulture ou InvariantCulture et ne pas spécifier la culture du tout? D'après ce que j'ai lu, si vous effectuez une sérialisation, par exemple, vous avez besoin de InvariantCulture pour spécifier une représentation canonique d'une valeur de données. C'est un pourcentage relativement faible de manipulations de chaînes basées sur la culture.Quand devrais-je spécifier CurrentCulture ou InvariantCulture et quand dois-je le laisser non spécifié?

je trouve long, bavard, et laid la plupart du temps de préciser chaque fois que je fais, dire:

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

Cependant, mon équipe a récemment tourné FxCop sur et maintenant il y a un coup de pouce à toujours utiliser CultureInfo PARTOUT. Quelle est la meilleure technique pour combiner brièveté, lisibilité et fonctionnalité?

bon matériel de lecture:

Répondre

16

Il y a un compromis inhérent en jeu ici. Au minimum, vous devez spécifier CultureInfo pour utiliser InvariantCulture chaque fois que vous effectuez des opérations internes à votre programme. Par exemple, l'utilisation de la sérialisation force la représentation des données à toujours être la même, vous n'avez donc pas à vous inquiéter des problèmes d'internationalisation avec vos formats de données internes. Ceci étant dit, le fait de le spécifier partout présente certains avantages - principalement en vous obligeant à vous assurer que vous le manipulez correctement. Le travail du programme interne et le travail de l'interface utilisateur doivent avoir une culture différente spécifiée (à condition que vous souhaitiez correctement localiser votre application). En conséquence, un programme complexe tend à exiger que ceci soit spécifié partout, car laisser le "défaut" est dangereux au mieux, et tend à introduire des bugs au fil du temps. Toutefois, comme vous l'avez remarqué, cette spécification a tendance à augmenter la taille de votre code et à réduire potentiellement la lisibilité. Cela conduit au compromis - lisibilité et maintenabilité via un code plus court par rapport à une internationalisation et une localisation adéquates et une maintenabilité par le biais d'être plus explicite partout. À mon avis, il n'y a pas de «bonne» réponse ici - cela dépend vraiment de votre application. Si votre application est complètement sur la présentation, et ne pas faire beaucoup de manipulation de données, surtout pas avec n'importe quel type de stockage de fichiers auto-géré, la culture actuelle (et la culture ui) une fois peut-être bien. J'ai trouvé que les applications plus compliquées ont tendance à ne pas fonctionner aussi bien, cependant, dans ce cas, les suggestions de FxCop de spécifier cela partout semblent plus attrayantes.

+1

@Reed Copsey: J'ai aussi trouvé que l'ajouter partout comme un reflex FxCop crée des bugs - plusieurs fois j'ai vu des cas où la mauvaise option de culture a été spécifiée. C'est évidemment juste un problème d'éducation, mais c'est un phénomène courant quand quelque chose comme FxCop vous dit de faire des choses mais vous ne comprenez pas nécessairement pourquoi. –

+2

@Scott: Vrai. Mais c'est le cas de tout ce qui concerne la programmation. Si vous l'utilisez, vous devez le comprendre ou vous mordre. La seule façon raisonnable de faire de la localisation est de le considérer quand vous écrivez le code - localiser un produit terminé est l'un des pires travaux à faire, et un ordre de grandeur plus cher que d'y penser depuis le début. –

+0

Je ne suis pas d'accord. Est-ce que je mettrais la culture dans tous les ToString() de mes cours? Je pense que la logique et les objets devraient être inconscients de la culture. – onof

5

La valeur par défaut est déjà la culture actuelle initialisée par Windows. Donc, en utilisant CultureInfo.CurrentCulture explicitement, c'est juste une perte de temps. Tout format de sérialisation décent (y compris la sérialisation binaire et la sérialisation XML) sérialisera un DateTime d'une manière invariante de culture. L'utilisation d'une culture qui n'est pas la valeur par défaut est très dangereuse. Un thread sera toujours démarré avec la culture par défaut spécifiée par Windows et configurée par l'utilisateur lors de l'installation de Windows. .NET démarre les threads threadpool tout le temps et vous risquez d'obtenir une culture dans ce thread qui est différente de votre thread principal. Ce qui peut causer toutes sortes de problèmes subtils. Comme avoir un SortedList qui n'est soudainement plus trié.