Каков наилучший способ хранения группы констант, которые использует моя программа?

У меня разные константы, которые использует моя программа. Некоторые из них string s, некоторые - int s, а некоторые - double s. Каков наилучший способ их хранения? Я не думаю, что хочу Enum, потому что данные не все одинаковы, и я хочу вручную установить каждое значение. Должен ли я просто хранить их все в пустом классе или есть лучший способ?

Ответ 1

Вероятно, вы могли бы иметь их в статическом классе со статическими свойствами только для чтения.

public static class Constants
{
   public static string SomeConstant { get { return "Some value"; } }
}

Ответ 2

IMO, используя класс, полный констант, отлично подходит для констант. Если они будут меняться в два раза, я рекомендую использовать AppSettings в вашей конфигурации и в классе ConfigurationManager.

Когда у меня есть "константы", которые действительно втянуты из AppSettings или аналогичных, я все равно всегда буду иметь класс "константы", который переносит чтение из диспетчера конфигурации. Всегда лучше иметь Constants.SomeModule.Setting вместо того, чтобы прибегать непосредственно к ConfigurationManager.AppSettings["SomeModule/Setting"] в любом месте, которое хочет использовать указанное значение настройки.

Бонусные баллы для этой установки, так как SomeModule скорее всего будет вложенным классом внутри файла Constants, вы можете легко использовать Injection Dependency для инъекции либо SomeModule непосредственно в классы, которые зависят от него. Вы могли бы даже извлечь интерфейс поверх SomeModule, а затем создать отступ от ISomeModuleConfiguration в своем потребительском коде, это позволит вам отделить зависимость от файлов Constants и даже потенциально упростить тестирование, особенно если эти параметры поступают из AppSettings, и вы меняете их с помощью конфигурационных преобразований, потому что настройки являются специфичными для среды.

Ответ 3

Мне нравится делать следующее (но обязательно прочитайте до конца, чтобы использовать правильный тип констант):

internal static class ColumnKeys
{
    internal const string Date = "Date";
    internal const string Value = "Value";
    ...
}

Прочитайте это, чтобы знать, почему const может быть не таким, каким вы хотите. Возможные типы констант:

  • const. Не используйте в сборках (public или protected), если значение может измениться в будущем, потому что это значение будет жестко запрограммировано во время компиляции в этих других сборках. Если вы измените значение, старое значение будет использоваться другими сборками, пока они не будут скомпилированы.
  • static readonly Поля
  • static свойство без set

Ответ 4

Это лучший способ ИМО. Нет необходимости в свойствах или только для чтения:

public static class Constants
{
   public const string SomeConstant = "Some value";
}

Ответ 5

Пустой статический класс подходит. Подумайте о том, как использовать несколько классов, чтобы вы получили хорошие группы связанных констант, а не один гигантский файл Globals.cs.

Кроме того, для некоторых int-констант рассмотрим обозначение:

[Flags]
enum Foo
{
}

Так как это позволяет обрабатывать значения, такие как флаги.

Ответ 6

Еще одно голосование за использование web.config или app.config. Конфигурационные файлы - хорошее место для констант, таких как строки подключения и т.д. Я предпочитаю не смотреть на источник, чтобы просматривать или изменять эти типы вещей. Статический класс, который читает эти константы из файла .config, может быть хорошим компромиссом, так как он позволит вашему приложению получать доступ к этим ресурсам, как если бы они были определены в коде, но при этом все же дает вам гибкость в их легко просматриваемом/редактируемом пространство.

Ответ 7

Да, a static class для хранения констант будет просто прекрасным, за исключением констант, связанных с конкретными типами.

Ответ 8

Если эти константы являются ссылками на службы или переключателями, которые влияют на поведение приложения, я бы установил их как пользовательские настройки приложения. Таким образом, если их нужно изменить, вам не нужно перекомпилировать, и вы все равно можете ссылаться на них через класс статических свойств.

Properties.Settings.Default.ServiceRef

Ответ 9

Я бы предложил статический класс со статическим readonly. Ниже приведен фрагмент кода:

  public static class CachedKeysManager
    {
        public static readonly string DistributorList = "distributorList";
    }