2010-07-12 21 views
19

Was ist die beste Vorgehensweise, um CurrentCulture oder InvariantCulture anzugeben und die Kultur überhaupt nicht anzugeben?Wann sollte ich CurrentCulture oder InvariantCulture angeben und wann sollte ich sie nicht spezifizieren?

Von dem, was ich gelesen habe, wenn Sie zum Beispiel Serialisierung machen, benötigen Sie InvariantCulture als Mittel zur Angabe einer kanonischen Darstellung eines Datenwerts. Das ist ein relativ geringer Prozentsatz von kulturbasierten String-Manipulationen.

Ich finde es lange, ausführliche und hässlich die meiste Zeit es ich jedes Mal angeben, sagen:

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

aber mein Team vor kurzem drehte FxCop auf und jetzt gibt es eine Push-to immer verwenden Kulturinfo ÜBERALL. Was ist die beste Technik, um die Kürze, Lesbarkeit und Funktionalität zu kombinieren?

Einige gute Lesematerial:

Antwort

16

Es gibt einen inhärenten Kompromiß hier im Spiel.

Sie sollten mindestens CultureInfo angeben, um InvariantCulture zu verwenden, wenn Sie interne Vorgänge in Ihrem Programm ausführen. Wenn Sie dies beispielsweise mit Serialisierung verwenden, ist die Datendarstellung immer gleich, sodass Sie sich keine Sorgen über Internationalisierungsprobleme mit Ihren internen Datenformaten machen müssen.

Dies gesagt, hat die Angabe dies überall einige Vorteile - vor allem in Bezug auf Sie zwingt, um sicherzustellen, dass Sie dies richtig behandeln. Für interne Programmarbeit und für die Benutzeroberfläche muss eine andere Kultur angegeben werden (vorausgesetzt, Sie möchten Ihre Anwendung ordnungsgemäß lokalisieren). Dies führt dazu, dass ein komplexes Programm dazu neigt, dies überall zu spezifizieren, da das Verlassen des "Standards" bestenfalls gefährlich ist und dazu neigt, Fehler im Laufe der Zeit einzuführen.

Wenn Sie dies jedoch angeben, erhöht sich die Größe Ihres Codes und die Lesbarkeit wird möglicherweise beeinträchtigt. Dies führt zu einem Kompromiss - Lesbarkeit und Wartbarkeit durch einen kürzeren Code vs. korrekte Internationalisierung und Lokalisierung und Wartbarkeit durch expliziteres Auftreten überall.

Meiner Meinung nach gibt es hier keine "richtige" Antwort - es hängt wirklich von Ihrer Anwendung ab. Wenn es bei Ihrer Anwendung ausschließlich um die Präsentation geht und nicht viel Datenmanipulation durchgeführt wird, insbesondere nicht bei jeder Art von selbst verwaltetem Dateispeicher, kann das Einstellen der aktuellen Kultur (und der ui-Kultur) einmalig sein. Ich habe festgestellt, dass kompliziertere Anwendungen auf diese Weise nicht so gut funktionieren. In diesem Fall scheinen die Vorschläge von FxCop, dies überall zu spezifizieren, attraktiver zu sein.

+1

@Reed Copsey: Ich habe auch festgestellt, dass das Hinzufügen von überall als FxCop Reflex Fehler verursacht - mehrmals habe ich Instanzen gesehen, wo die falsche Kultur-Option angegeben wurde. Dies ist offensichtlich nur ein Bildungsproblem, aber es ist ein häufiges Vorkommnis, wenn etwas wie FxCop Ihnen sagt, dass Sie Dinge tun sollen, aber Sie verstehen nicht unbedingt warum. –

+2

@ Scott: Wahr. Aber das ist bei allem Programmieren der Fall - wenn Sie es benutzen wollen, müssen Sie es verstehen oder es wird Sie beißen. Der einzig vernünftige Weg zur Lokalisierung besteht darin, sie beim Schreiben des Codes zu berücksichtigen. Die Lokalisierung eines fertigen Produkts ist eine der schlimmsten Aufgaben und eine Größenordnung, die teurer ist, als von Anfang an darüber nachzudenken. –

+0

Ich stimme nicht zu. Würde ich die Kultur in alle ToString() meiner Klassen setzen? Ich denke, Logik und Objekte sollten sich der Kultur nicht bewusst sein. – onof

5

Der Standardwert ist bereits die aktuelle Kultur, die von Windows initialisiert wird. CultureInfo.CurrentCulture explizit zu verwenden, ist nur eine Verschwendung von Zeit. Jedes anständige Serialisierungsformat (einschließlich binärer Serialisierung und XML-Serialisierung) wird eine DateTime in einer kulturinvarianten Weise serialisieren.

Die Verwendung einer Kultur, die nicht die Standardeinstellung ist, ist sehr gefährlich. Ein Thread wird immer mit der Standardkultur gestartet, die von Windows festgelegt und vom Benutzer bei der Installation von Windows konfiguriert wurde. .NET startet die Threadpool-Threads ständig und Sie riskieren eine Kultur in diesem Thread, die sich von Ihrem Hauptthread unterscheidet. Das kann alle möglichen subtilen Probleme verursachen. Wie eine SortedList, die plötzlich nicht mehr sortiert ist.