Класс, подобный enum

Я ищу наилучшую практику в том, как создавать enum-подобный класс, который вместо чисел содержит строковые значения. Что-то вроде этого:

public static class CustomerType
{
  public static string Type1 = "Customer Type 1";
  public static string Type2 = "Customer Type 2";
}

Я бы использовал этот класс во всем приложении как значение для всех случаев, когда мне нужен CustomerType. Я не могу использовать Enum, потому что это устаревшая система, и значения, подобные этому, жестко закодированы повсюду, я просто пытаюсь централизовать их в одном месте.

Вопрос в приведенном выше примере должен использоваться для объявления переменной:

  • статическое ключевое слово для чтения
  • ключевое слово const
  • или просто статический

Какова была бы наилучшая практика для установки этих классов и значений?

Ответ 1

Нельзя использовать plain static, потому что поля могут быть непреднамеренно изменены и вызвать таинственный поломка. Поэтому ваши два варианта: static readonly и const.

const приведет к тому, что значение переменной будет внедрено в код вызова во время компиляции, что будет эффективно эквивалентно старому жесткокодированному коду (но с преимуществом символической константы). Опасность const заключается в том, что вы должны перекомпилировать все, если изменяется const, чтобы вы не столкнулись с непостоянными константами и сложными ошибками.

static readonly приведет к нормальному доступу к полю, поэтому у вас не будет проблем с синхронизацией. Тем не менее, вы можете получить небольшой выигрыш в производительности из-за дополнительного доступа к полю (хотя он, вероятно, будет незаметным, если вы не будете использовать эти поля в критическом для производительности коде). Если вы считаете, что вам придется изменить строки в какой-то момент в будущем, вы захотите использовать static readonly.

Из звуков этого значения значения будут меняться достаточно редко, чтобы const был безопасным. Однако окончательное решение зависит от вас.

Ответ 2

Если вы используете С#, почему бы не создать перечисление и установить string на основе Description attribute для значений enum, как показано ниже:

public enum CustomerType
{
    [System.ComponentModel.Description("Customer Type 1")]
    Type1,

    [System.ComponentModelDescription("Customer Type 2")]
    Type2
}

Затем вы можете получить значение Description значений перечисления, как показано ниже:

int value = CustermType.Type1;
string type1Description = Enums.GetDescription((CustomerType)value);

Для других способов получения значения атрибута Description перечисления см. SO QA