Mam różne stałe, których mój program używa ... string
, int
's, double
' s, itd ... Jaki jest najlepszy sposób ich przechowywania? Wydaje mi się, że nie chcę Enum
, ponieważ dane nie są tego samego typu i chcę ręcznie ustawić każdą wartość. Czy powinienem po prostu przechowywać je wszystkie w pustej klasie? Czy jest jakiś lepszy sposób?
97
Odpowiedzi:
Prawdopodobnie mógłbyś mieć je w klasie statycznej ze statycznymi właściwościami tylko do odczytu.
źródło
IMO używające klasy pełnej stałych jest dobre dla stałych. Jeśli będą się zmieniać od czasu do czasu, polecam zamiast tego użycie AppSettings w konfiguracji i klasie ConfigurationManager.
Kiedy mam „stałe”, które są faktycznie pobierane z AppSettings lub podobnych, nadal będę mieć klasę „constants”, która zawija odczyt z menedżera konfiguracji. Zawsze bardziej sensowne jest mieć,
Constants.SomeModule.Setting
zamiast uciekać się bezpośrednio doConfigurationManager.AppSettings["SomeModule/Setting"]
dowolnego miejsca, które chce skonsumować tę wartość ustawienia.Dodatkowe punkty za tę konfigurację, ponieważ
SomeModule
prawdopodobnie byłaby to klasa zagnieżdżona w pliku Constants, można z łatwością użyć funkcji Dependency Injection, aby wstrzyknąćSomeModule
bezpośrednio do klas, które od niej zależą. Możesz nawet wyodrębnić interfejs na wierzchu,SomeModule
a następnie utworzyć zależność odISomeModuleConfiguration
używanego kodu, co pozwoli ci oddzielić zależność od plików Constants, a nawet potencjalnie ułatwi testowanie, zwłaszcza jeśli te ustawienia pochodzą z AppSettings i zmieniasz je za pomocą transformacji konfiguracji, ponieważ ustawienia są specyficzne dla środowiska.źródło
Lubię robić następujące rzeczy (ale pamiętaj, aby przeczytać do końca, aby użyć odpowiednich typów stałych ):
Przeczytaj to, aby dowiedzieć się, dlaczego
const
może nie być tym, czego chcesz. Możliwe typy stałych to:const
pola. Nie używaj między zestawami (public
lubprotected
), jeśli wartość może się zmienić w przyszłości, ponieważ wartość zostanie zakodowana na stałe w czasie kompilacji w tych innych zestawach. Jeśli zmienisz wartość, stara wartość będzie używana przez inne zestawy, dopóki nie zostaną ponownie skompilowane.static readonly
polastatic
nieruchomość bezset
źródło
To jest najlepszy sposób IMO. Nie ma potrzeby korzystania z właściwości lub tylko do odczytu:
źródło
Odpowiednia jest pusta klasa statyczna. Rozważ użycie kilku klas, aby uzyskać dobre grupy powiązanych stałych, a nie jeden gigantyczny plik Globals.cs.
Dodatkowo, dla niektórych stałych int, rozważ notację:
Ponieważ pozwala to traktować wartości jak flagi .
źródło
Kolejny głos za użyciem web.config lub app.config. Pliki konfiguracyjne są dobrym miejscem na stałe, takie jak parametry połączenia, itp. Wolę nie patrzeć na źródło, aby przeglądać lub modyfikować tego typu rzeczy. Klasa statyczna, która odczytuje te stałe z pliku .config, może być dobrym kompromisem, ponieważ umożliwi aplikacji dostęp do tych zasobów tak, jakby były zdefiniowane w kodzie, ale nadal zapewnia elastyczność polegającą na umieszczeniu ich w łatwo przeglądalnym / edytowalnym przestrzeń.
źródło
Tak,
static class
do przechowywania stałych wystarczyłoby, z wyjątkiem stałych powiązanych z określonymi typami.źródło
Jeśli te stałe są odwołaniami do usług lub przełącznikami, które wpływają na zachowanie aplikacji, ustawiłbym je jako ustawienia użytkownika aplikacji. W ten sposób, jeśli trzeba je zmienić, nie trzeba ich ponownie kompilować i nadal można się do nich odwoływać za pośrednictwem statycznej klasy właściwości.
źródło
Sugerowałbym klasę statyczną ze statycznym tylko do odczytu. Poniżej znajdziesz fragment kodu:
źródło