При объявлении перечисления, вы должны заставить тип байта для менее чем 256 объектов? - PullRequest
30 голосов
/ 16 марта 2009

Если у вас есть enum в вашем приложении, и у вас есть только несколько элементов, должны ли вы заставить базовый тип быть наименьшим возможным типом?

    enum smaller : byte
    {
        one,
        two,
        three
    };

Ответы [ 6 ]

38 голосов
/ 16 марта 2009

Нет. Не преждевременно оптимизируйте , если с помощью профилировщика вы не доказали, что это действительно проблема.

28 голосов
/ 16 марта 2009

Относительно лучших практик:

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

Каждый раз, когда вы используете enum в операторе switch, вы должны иметь предложение «default» для недопустимого значения enum. Поэтому не имеет значения, проверяете ли вы 256-NumRealEnumValues ​​или 2 ^ 32-NumRealEnumValues. Оба будут иметь предложение по умолчанию, которое обрабатывает все недопустимые случаи.

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

Изменение типа на наименьшее соответствие также не поможет вам с проблемами управления версиями. Если у вас точно не указан максимальный размер перечисления. Под проблемами управления версиями я подразумеваю, когда у вас есть скомпилированная dll с использованием enum, а затем вы добавляете новое значение enum, может выполняться некоторый код, который не предназначен для включения в предложение «default» оператора switch.

Относительно эффективности:

Нет, нет никакой выгоды с точки зрения эффективности, чтобы сделать его байтом.

int более эффективен в использовании, поскольку процессор на x86 имеет 32-битные регистры. Копирование в регистр выполняется за 32 бита за раз.

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

8 голосов
/ 16 марта 2009

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

2 голосов
/ 22 февраля 2018

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


Сценарий: У вас есть столбец в базе данных: status_id с типом tinyint. И у вас есть enum в вашем коде: enum Status { Well = 1, Bad = 2 }. И вы используете это перечисление в некоторой сущности. Допустим, вы используете базовые структуры ядра 2.0. Если вы попытаетесь прочитать / записать эту сущность из базы данных, вы получите сообщение об ошибке «Невозможно привести объект», если вы не укажете тип byte явно.

2 голосов
/ 16 марта 2009

Что бы получить? Вы бы сэкономили колоссальные 3 байта памяти за счет немного более медленного выполнения и менее интуитивного или читабельного кода. (Читая это, я должен задаться вопросом, действительно ли у pyou была причина для того, чтобы сделать его байтом, и какова могла быть эта причина. Предположительно, вы по какой-то причине не использовали тип по умолчанию).

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

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

0 голосов
/ 16 марта 2009

Не следует присваивать перечислениям определенный целочисленный тип, а позволить среде .NET определить лучший «размер» для перечисления. Как сказал JaredPar, если вы измените тип данных, вы должны определенно проверить, действительно ли это помогает.

Дело в том, что 32-разрядные целые числа "естественны" для процессоров x86, поскольку их можно легко выровнять оптимальным образом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...