2015-09-30 4 views
0

В нашей базе данных есть таблица ObjectType. В этой таблице просто содержится ряд строк с идентификатором Id и ObjectName. В нашем внутреннем коде мы обрабатываем разные объекты по-разному, поэтому часто требуется ссылаться на идентификатор объекта для сравнения. Эти идентификаторы всегда одинаковы, и они всегда сопоставляются с одним и тем же объектом.Когда использовать Enum vs Struct

Какая конструкция будет лучше для обработки этих объектов, если мои методы ожидают, что целочисленное значение будет передано им?

Когда я буду использовать структуру? Когда я буду использовать перечисление?

+0

Первым, кто пришел на ум, был класс. –

ответ

0

Вы можете прочитать весь стол ObjectType в Dictionary<string, int>. Соедините id с ObjectName. Для методов, ожидающих int, вы можете передать их objectTypeMapping["objectName"].

+0

К счастью, таблица «ObjectType» довольно мала и полностью статична. После определения в коде я просто хотел бы называть что-то вроде 'ObjectType.User', и я бы получил целочисленное значение. –

+0

@Jdsfighter: Оба перечисления и словарь подходят для этого случая. Вы, даже если таблица ObjectType статична, гарантированно имеют ваши идентификаторы с шагом 1 всегда? Если нет, перейдите в словарь, потому что легче приступить к подготовке словаря автоматически при каждом запуске после чтения таблицы, вместо того, чтобы вручную модифицировать переписанное кодирование вручную, когда ваша таблица изменилась. – displayName

+0

Данные таблицы всегда статичны. Раньше разработчики жестко кодировали идентификаторы в каждую строку кода. Существуют сотни (если не тысячи) хранимых процедур, которые относятся к объектам только по их идентификатору. И в нашем базовом коде это больше одно и то же. –

1

struct не является альтернативой enum, это альтернатива class. Это просто макет памяти, который отличается в структуре и классе.

Если вам не нужен ваш код и поддержка новых записей, добавленных в вашу БД, я бы пошел на перечисления.

В противном случае, если вам необходимо поддерживать новые заходы DB, я бы рассмотреть Dictionary<int, string>

+0

По существу, я хочу, чтобы использовать целочисленное значение, содержащееся в объекте, для определения того, какой объект выбран, а затем использовать Id для управления другими записями. Например, выражение «ObjectType.User» вернет 9, поэтому в моем коде я могу присвоить это значение другой записи/переменной, но я мог бы также использовать его для сравнения. Эти значения не нужно извлекать из базы данных, так как практически нет шансов, что они когда-либо изменятся. –

+0

Перечислите определенно то. Даунсайд: вам нужно синхронизировать их с DB –

3

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

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

Допустим, у вас есть класс Person и допустим, что для какой-либо причине человек может иметь эмоциональное состояние.

Хорошая реализация будет использовать перечисление вроде этого:

enum EmotionalState 
{ 
    Happy = 3, 
    Sad, 
    Shy  
} 

Вы можете использовать элементы перечислений в виде целых чисел, как это:

int b = (int)EmotionalState.Sad // <---4 

, а также в обратном направлении

int v = 3; 
EmotionalState s = (EmotionalState)v; // Happy 

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

Хороший пример для структуры является точка

struct Point { 
    int a; 
    int b; 
} 

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

+0

Единственная реальная необходимость, которую я имею, это иметь возможность видеть, что Id/Value сохраняется внутри каждого объекта. Таким образом, если я скажу 'var someVar = ObjectType.Role', я смог бы присвоить целочисленное значение' someVar'. Это также сделает мой код более удобочитаемым, поскольку я бы не сказал 'if (objectType == 15) {}'. Мне просто нужно убедиться, что значение, присвоенное переменной, остается легко доступным, так как я использую числовой идентификатор в нескольких вставках/запросах. Раньше я использовал структуры со статически определенными значениями или константами. –

+0

@Jdsfighter вы могли бы связать их в одном перечислении, если это делает концептуальный смысл (например, пример с эмоциональным состоянием). Значение, которое вы назначили в перечислении, легко доступно, например, EmotionalState b = (EmotionalState) 15; – Hristo

0

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

enum Sports { 
     Soccer, Tennis, Football, Baseball 
} 

выведет: Sports. | Soccer | | Tennis | | Footbal | | Baseball |

+0

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