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.Settingzamiast uciekać się bezpośrednio do ConfigurationManager.AppSettings["SomeModule/Setting"]dowolnego miejsca, które chce skonsumować tę wartość ustawienia.
Dodatkowe punkty za tę konfigurację, ponieważ SomeModuleprawdopodobnie byłaby to klasa zagnieżdżona w pliku Constants, można z łatwością użyć funkcji Dependency Injection, aby wstrzyknąć SomeModulebezpośrednio do klas, które od niej zależą. Możesz nawet wyodrębnić interfejs na wierzchu, SomeModulea następnie utworzyć zależność od ISomeModuleConfigurationuż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.