2009-04-22 2 views
0

Ich behalte viele Einstellungen in AppSettings, und ich frage mich, ob es als gute Praxis angesehen wird, sie in UpperCase zu benennen. Im Wesentlichen sind sie die gleichen wie Konstanten oder? Wie ich es verstehe, wenn Sie die Web.Config ändern, führt die App eine Neukompilierung durch.Wie kann ich eine Variable als CONSTANT definieren, wenn sie aus Web.Config abgerufen wird?

So, dachte ich, sollten Sie die Einstellungen in AppSettings in GROSSBUCHSTABEN halten (Vorausgesetzt, dass Sie Ihre Konstanten mit Großbuchstaben nennen.)

Auch sollten Variablen, die Werte von AppSettings sein VERSALIEN bekommen?

EG.

String MY_SETTING = ConfigurationManager.AppSettings["MY_SETTING"]; 

Was ist der beste Weg, um mit diesen umzugehen und sie wie Konstanten aussehen und fühlen zu lassen? Ist das überhaupt eine gute Idee? Die einzige Art, wie ich denken konnte, wäre es nur lesbar werden machen:

readonly String MY_SETTING = ConfigurationManager.AppSettings["MY_SETTING"]; 

Aber dann weiß ich nicht, wie Sie dies mit einem int tun könnten:

readonly String MAX_USERS_S = ConfigurationManager.AppSettings["MAX_USERS"]; 
readonly int MAX_USERS; // needs to be set here... won't compile 
int.TryParse(MAX_USERS_S, out MAX_USERS); 

I Nur-Lese-Variablen schmutzig Einstellung irgendwie fühlen wie Konstanten aussehen, aber für mich sind Sachen in der web.config im Wesentlichen konstant.

Vorschläge?

Antwort

1

Wenn Sie wollen, dass sie wie Konstanten aussehen und sich so anfühlen, würde ich als erstes empfehlen, sie mit Pascal-case zu benennen, damit MY_SETTING (was nicht wirklich ein C# -ähnlicher Name ist) "MySetting" wäre. Sie sehen das sehr viel mit öffentlich exponierten Eigenschaften und Konstanten im Framework.

readonly ist der richtige Weg hier zu gehen. Im Falle eines Instanzfeldes kann es nur in der Deklaration oder im Konstruktor gesetzt werden. Für statische Felder kann es nur im statischen Konstruktor oder in der Deklaration festgelegt werden.

Für den Aufruf zu TryParse, können Sie es in Ihrem Konstruktor oder der statische Konstruktor gesetzt würden, je nachdem, ob oder nicht, es war eine Instanz oder statisches Feld:

static MyClass() 
{ 
    // The value. 
    int myUsers; 

    // Try to parse. 
    if (int.TryParse(MAX_USERS_S, out myUsers)) 
    { 
     // Assign. 
     MyUsers = myUsers; 
    } 
} 
1

Nein. In .NET naming guidelines gibt es keine Fälle von Großbuchstaben.

+0

Benennungsrichtlinien oder nicht. Unternehmen haben auch Benennungsrichtlinien. – Armstrongest

+0

Wenn Sie eigene Benennungsrichtlinien haben, können Sie diese natürlich gegenüber denen von jemand anderem verwenden. Aber dann sehe ich den Punkt der Frage nicht; Beachten Sie, dass die Benennungsrichtlinien den Idiomen der betreffenden Tools entsprechen sollten. – Richard

2

Wenn Sie glauben, dass sie effektiv konstant sind, und sie sind readonly Variablen eines unveränderlichen Typs (int, string etc) dann verwenden Sie unbedingt die gleiche Namenskonvention. In der Tat, das ist was String.Empty tut. Die .NET naming convention für Konstanten ist jedoch nicht SHOUTY_CAPS, es ist PascalCase.

+0

Ist das nicht dasselbe wie öffentliche Variablen? – Armstrongest

+0

Ja - aber die einzigen öffentlichen Variablen, die Sie haben sollten, sind sowieso nur unveränderliche, was genau das Szenario ist, das Sie beschreiben. –

+0

(Readonly * statische * unveränderliche, sorry.) –

1

Wie ich es verstehe, Wenn Sie die Web.Config ändern, führt die App eine Neukompilierung durch.

Das ist richtig, jede Änderung an der Web.Config wird die App neu kompilieren. Sogar Änderungen so klein wie ein Newline.


Frage der Namenskonventionen Ignorieren, könnten Sie folgendes Zubehör mit Ihrem Beispiel tun:

readonly int MAX_USERS = 
    int.Parse(ConfigurationManager.AppSettings["MAX_USERS"]) 

Offensichtlich ist dies kein sicherer Weg, dies in dem Fall zu tun, dass MAX_USERS kein int, aber es scheint, dass das Werfen einer Ausnahme, wenn MAX_USERS nicht eingestellt werden kann, die richtige Vorgehensweise wäre.

+0

Guter Punkt. Tatsächlich glaube ich, dass die int.TryParse-Methode die Methode einfach um einen Try-Catch-Block wickelt. Aber immer noch, aber die Idee, alles zu versuchen/zu fangen, macht mich nervös. :-) – Armstrongest

Verwandte Themen