2014-02-05 2 views
3

Учитывая эти два перечислений:Номерные перечисление против Бессчетных перечисления

public enum test 
{ 
    one = 1, 
    two, 
    three 
} 

public enum test2 
{ 
    zero = 0, 
    one = 1, 
    two = 2, 
    three = 3 
} 

Я предпочитаю использовать первый метод. Я вижу, что многие проекты с открытым исходным кодом и код в моей работе используют второй метод, в котором каждый элемент имеет значение. Я редко вижу первый пример, когда-либо закодированный. Для этого есть причина? Почему второй подход предпочтительнее первого? Кроме того, вы можете изменить заголовок этого вопроса на более подходящий заголовок, поскольку я не уверен, как сформулировать этот вопрос.

+2

В первом случае, если кто-то добавил значение 'foo' между' one' и 'two', тогда все следующие значения вашего перечисления изменились. Во втором примере этого не произойдет. Тем не менее, это, вероятно, скорее вопрос мнения и не подходит для Stack Overflow. –

ответ

2

Элементы перечисления имеют имена и значения. Это почти все о контрольных значениях. Существует много перечислений, и в некоторых из них вы найдете уход о значениях.

Вот некоторые примеры:

  • Если вы используете XmlSerializer, то имя элемента (текст) используется для хранения значения свойства. Здесь вам не нужны значения.
  • Если вы сохраняете результат в базе данных, то, скорее всего, вы будете использовать текстовое поле и синтаксический анализ, но скорее числовое поле. Таким образом, перечисление сохраняется как значение элемента. Здесь вы заботитесь о них, потому что обновление перечисления (добавление новых элементов к нему) может сделать уже сохраненные в значениях базы данных недопустимыми.
  • Если вы используете битовые поля, или если значение перечислений фактически группируется константы (перечисление может быть использовано как объединение констант в группу их, к примеру, в iTextSharp есть hundereds из несгруппированных констант, что делает сложно найти нужный, если бы у них были категории, или перечисления, чтобы их удержать - было бы намного проще), тогда вы заботитесь о значениях.

На самом деле существуют известные правила того, как компилятор присваивает значения элементам перечисления.Так что если, к примеру, у вас это перечисление

public enum test 
{ 
    one, 
    two, 
    three 
} 

тогда, когда вам нужно добавить four и oneandhalf к нему вы можете сделать добавить его как этот

public enum test 
{ 
    one, 
    two, 
    three, 
    four, 
    oneandhalf 
} 

или как это

public enum test 
{ 
    one = 0, 
    oneandhalf = 4, 
    two = 1, 
    three = 2, 
    four = 3, 
} 

, и вы по-прежнему сохраняете обратную совместимость (ранее сохраненные в значениях базы данных после обновления). Обратите внимание, что вам нужно явно указывать значения, когда вставляет элементы между существующими или что-то bad может случиться.

2

Второй вариант более безопасен для сериализации. Одним из примеров, который приходит на ум, является WCF. Фактически, сериализация в WCF генерирует исключение, если вы попытаетесь передать объект с неинициализированными членами перечисления.

0

Потому что мы можем использовать второй метод следующим образом

public enum test2 
{ 
    zero = 0, 
    one = 5, 
    two = 10, 
    three = 20 
} 

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

2

Не уверен, что есть канонический ответ на ваш вопрос, но я бы рискнул, что преимущество второго метода заключается в том, что если кто-то удаляет определенную ценность, вещи не будут автоматически перенумеровать. В первом примере, если кто-то удалил two, значение three было бы внезапно 2. Не так хорошо ...

0

Рассмотрим следующие 2 перечислений, и вы увидите, какой из них лучше за себя:

public enum numbers 
{ 
    one = 5, 
    hundred = 100, 
    thousand = 1000 
} 

и

public enum numbers 
{ 
    one, 
    hundred, 
    thousand 
} 

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

Смежные вопросы