Ich habe verschiedene Konstanten, die mein Programm verwendet ... string
's, int
' s, double
's, etc ... Was ist der beste Weg, um sie zu speichern? Ich glaube nicht, dass ich eine möchte Enum
, da die Daten nicht alle vom gleichen Typ sind und ich jeden Wert manuell festlegen möchte. Soll ich sie alle in einer leeren Klasse aufbewahren? Oder gibt es einen besseren Weg?
97
Antworten:
Sie könnten sie wahrscheinlich in einer statischen Klasse mit statischen schreibgeschützten Eigenschaften haben.
quelle
IMO mit einer Klasse voller Konstanten ist für Konstanten in Ordnung. Wenn sie sich gelegentlich ändern, empfehle ich, stattdessen AppSettings in Ihrer Konfiguration und in der ConfigurationManager-Klasse zu verwenden.
Wenn ich "Konstanten" habe, die tatsächlich aus AppSettings oder ähnlichem abgerufen werden, habe ich immer noch eine "Konstanten" -Klasse, die das Lesen vom Konfigurationsmanager umschließt. Es ist immer sinnvoller zu haben,
Constants.SomeModule.Setting
anstatt direktConfigurationManager.AppSettings["SomeModule/Setting"]
auf einen Ort zurückgreifen zu müssen, der diesen Einstellwert konsumieren möchte.Bonuspunkte für dieses Setup, da
SomeModule
es sich wahrscheinlich um eine verschachtelte Klasse in der Konstantendatei handelt, können Sie Dependency Injection problemlos verwenden, um entwederSomeModule
direkt in davon abhängige Klassen zu injizieren . Sie können auch eine Schnittstelle darüber extrahierenSomeModule
und dann eine Abhängigkeit vonISomeModuleConfiguration
Ihrem konsumierenden Code erstellen. Auf diese Weise können Sie die Abhängigkeit von den Konstantendateien entkoppeln und das Testen möglicherweise sogar vereinfachen, insbesondere wenn diese Einstellungen von AppSettings und stammen Sie ändern sie mithilfe von Konfigurationstransformationen, da die Einstellungen umgebungsspezifisch sind.quelle
Was ich gerne mache, ist Folgendes (aber lesen Sie es unbedingt bis zum Ende durch, um den richtigen Konstantentyp zu verwenden ):
Lesen Sie dies, um zu erfahren, warum Sie
const
möglicherweise nicht das sind, was Sie wollen. Mögliche Arten von Konstanten sind:const
Felder. Verwenden Sie nicht über Baugruppen (public
oderprotected
) , wenn der Wert könnte sich in Zukunft ändern , da der Wert zum Zeitpunkt der Kompilierung in den anderen Baugruppen fest einprogrammiert werden. Wenn Sie den Wert ändern, wird der alte Wert von den anderen Assemblys verwendet, bis sie neu kompiliert werden.static readonly
Felderstatic
Eigentum ohneset
quelle
Dies ist der beste Weg IMO. Keine Notwendigkeit für Eigenschaften oder schreibgeschützt:
quelle
Eine leere statische Klasse ist angemessen. Verwenden Sie mehrere Klassen, damit Sie gute Gruppen verwandter Konstanten erhalten und nicht eine riesige Globals.cs-Datei.
Berücksichtigen Sie für einige int-Konstanten außerdem die Notation:
Dies ermöglicht es , die Werte wie Flags zu behandeln .
quelle
Eine weitere Abstimmung für die Verwendung von web.config oder app.config. Die Konfigurationsdateien sind ein guter Ort für Konstanten wie Verbindungszeichenfolgen usw. Ich möchte lieber nicht auf die Quelle schauen müssen, um diese Art von Dingen anzuzeigen oder zu ändern. Eine statische Klasse, die diese Konstanten aus einer .config-Datei liest, kann ein guter Kompromiss sein, da Ihre Anwendung auf diese Ressourcen zugreifen kann, als wären sie im Code definiert, aber dennoch die Flexibilität bietet, sie in einer leicht sichtbaren / bearbeitbaren Datei zu haben Platz.
quelle
Ja, ein
static class
zum Speichern von Konstanten wäre in Ordnung, mit Ausnahme von Konstanten, die sich auf bestimmte Typen beziehen.quelle
Wenn diese Konstanten Dienstreferenzen oder Schalter sind, die das Anwendungsverhalten beeinflussen, würde ich sie als Anwendungsbenutzereinstellungen einrichten. Auf diese Weise müssen Sie sie nicht neu kompilieren, wenn sie geändert werden müssen, und Sie können sie dennoch über die statische Eigenschaftenklasse referenzieren.
quelle
Ich würde statische Klasse mit statischer schreibgeschützter Klasse vorschlagen. Das folgende Code-Snippet finden Sie unten:
quelle