Если у вас есть перечисление в вашем приложении, и у вас есть только несколько элементов, вы должны заставить основной тип быть наименьшим возможным типом?
enum smaller : byte
{
one,
two,
three
};
Если у вас есть перечисление в вашем приложении, и у вас есть только несколько элементов, вы должны заставить основной тип быть наименьшим возможным типом?
enum smaller : byte
{
one,
two,
three
};
Нет. Не преждевременно оптимизируйте , если вы не доказали, что профилировщик действительно является проблемой.
Относительно лучшей практики:
Если у вас нет конкретной причины сделать перечисление байтом типа, вы должны оставить его по умолчанию.
Каждый раз, когда вы используете перечисление в инструкции switch, у вас должно быть предложение по умолчанию для недопустимого значения перечисления. Поэтому неважно, проверяете ли вы 256-NumRealEnumValues или 2 ^ 32-NumRealEnumValues. Оба будут иметь предложение по умолчанию, которое обрабатывает все недопустимые случаи.
Одной из причин явной установки типа перечисления является то, что вы хотите, чтобы ваше перечисление соответствовало другому типу в вашей программе, и вам нужно явно указать между ними.
Изменение типа до наименьшего соответствия также не поможет вам в проблемах с версиями. Если у вас точно не указан максимальный размер переполнения. При проблемах с версиями я имею в виду, когда у вас есть скомпилированная dll с использованием перечисления, тогда вы добавляете новое значение перечисления, может выполняться какой-то код, который не предназначен для использования в предложении switch по умолчанию.
Относительно эффективности:
Нет никакой выгоды с точки зрения эффективности, чтобы сделать его байтом.
int более эффективен, потому что процессор на x86 имеет 32-разрядные регистры. Копирование в регистр выполняется по 32 бита за раз.
Когда вы используете меньший тип, вам нужно обнулить часть регистра и скопировать в остальные бит младшего разряда регистра.
Единственная причина для этого - хранить или передавать это значение с использованием определенного протокола, который требует, чтобы поле имело такой размер.
Что получится? Вы сохранили бы огромные 3 байта памяти за счет более медленного выполнения и менее интуитивного или читаемого кода. (Читая это, я должен задаться вопросом, действительно ли у pyou была причина сделать его байтом, и какова могла быть эта причина. Предположительно, вы поехали, чтобы использовать по умолчанию нестандартный тип).
Если вы планируете хранить миллионы этих вещей, тогда да, сохранение нескольких байтов на каждый может окупиться. В противном случае нет.
По той же причине вы обычно не используете байт или короткий вместо int.
Вы не должны назначать определенный тип целочисленного типа для перечислений, но пусть среда .NET определяет лучший "размер" для перечисления. Как сказал JaredPar, если вы измените тип данных, вам обязательно нужно проверить, действительно ли это помогает.
Дело в том, что 32-разрядные целые числа являются "естественными" на процессорах x86, потому что их можно легко выровнять оптимальным образом.