Класс, подобный 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