Начальное значение Enum
У меня есть класс со свойством, которое является перечислением
Перечисление
/// <summary>
/// All available delivery actions
/// </summary>
public enum EnumDeliveryAction
{
/// <summary>
/// Tasks with email delivery action will be emailed
/// </summary>
Email,
/// <summary>
/// Tasks with SharePoint delivery action
/// </summary>
SharePoint
}
Когда я создаю экземпляр этого класса, NOWHERE в коде, я указываю значение поля enum, но по умолчанию он по умолчанию относится к первому элементу в списке перечислений, а не к нулевому значению, так это перечисление Работа? Как можно гарантировать, что перечисление получает какое-то нулевое значение, если оно не установлено, я не хочу, чтобы оно по умолчанию было первым значением в перечислении.
Ответы
Ответ 1
Значение по умолчанию для enum
- это 0
(по умолчанию это первый элемент перечисления). Поля класса будут инициализированы значением по умолчанию.
Если вам нужно представить неизвестное значение в перечислении, вы можете добавить элемент Unknown
со значением 0. В качестве альтернативы вы можете объявить поле как Nullable<MyEnum>
(MyEnum?
).
Ответ 2
Перечисления - это тип значения, например, ints. Вам нужно сделать его нулевым, чтобы не по умолчанию использовать первый (или 0-определенный) член перечисления.
public class MyClass
{
public EnumDeliveryAction? DeliveryAction { get; set;}
}
Ответ 3
Поля Enum инициализируются как ноль; a, если вы не укажете значения в перечислении, они начинаются с нуля (Email = 0
, SharePoint=1
и т.д.).
Таким образом, по умолчанию любое поле, которое вы инициализируете, будет Email
. Для таких случаев относительно удобно добавлять None=0
или, альтернативно, использовать Nullable<T>
; то есть.
/// <summary>
/// All available delivery actions
/// </summary>
public enum EnumDeliveryAction
{
/// <summary>
/// Not specified
/// </summary>
None,
/// <summary>
/// Tasks with email delivery action will be emailed
/// </summary>
Email,
/// <summary>
/// Tasks with SharePoint delivery action
/// </summary>
SharePoint
}
Вы также должны быть уверены, что никогда не будете обрабатывать свое последнее ожидаемое значение по умолчанию; то есть.
switch(action) {
case EnumDeliveryAction.Email; RunEmail(); break;
default: RunSharePoint(); break;
}
это должно быть:
switch(action) {
case EnumDeliveryAction.Email; RunEmail(); break;
case EnumDeliveryAction.SharePoint; RunSharePoint(); break;
default: throw new InvalidOperationException(
"Unexpected action: " + action);
}
Ответ 4
Лучшая практика (как описано в анализе кода) заключается в том, чтобы всегда иметь значение по умолчанию в ваших перечислениях, которые представляют собой неустановленное значение.
Итак, в вашем случае вы можете:
public enum EnumDeliveryAction
{
/// <summary>
/// Default value
/// </summary>
NotSet,
/// <summary>
/// Tasks with email delivery action will be emailed
/// </summary>
Email,
/// <summary>
/// Tasks with SharePoint delivery action
/// </summary>
SharePoint
}
В стороне, вы не должны префикс имени enum с Enum. Возможно, вы захотите перейти на:
public enum DeliveryAction;
Ответ 5
Перечисления - это типы значений. Типы значений не могут быть пустыми и инициализированы 0.
Даже если ваше перечисление не имеет 0, переменные перечисления будут инициализированы до 0.
public enum SomeEnum
{
A = 1,
B = 2
}
(позже)
SomeEnum x = default(SomeEnum);
Console.WriteLine(x);
Выходы - 0
Некоторые ответчики рекомендуют использовать Nullable<T>
для соответствия ожиданиям инициализации. Будьте осторожны с этим советом, поскольку Nullable<T>
по-прежнему является типом значения и имеет разную семантику, чем ссылочные типы. Например, он никогда не будет генерировать исключение нулевой ссылки (это не ссылка).
SomeEnum? x = default(SomeEnum?);
if (x == null)
{
Console.WriteLine("It null!");
}
if (x > SomeEnum.B)
{
}
else
{
Console.WriteLine("This runs even though you don't expect it to");
}
Ответ 6
Вы можете запустить свои перечисления с любым значением (например, 1), но когда они представляют значение поиска в базе данных, вы обычно хотите, чтобы они соответствовали.
Обычно я объявляю первый Enum как None (= 0), когда имеет смысл сделать это, в соответствии с рекомендациями .Net Framework Design.
Ответ 7
Традиционный aproach для добавления значения null к значениям, которые обычно не имеют, заключается в том, чтобы объявить вашу переменную как нулевой тип, то есть:
EnumDeliveryAction? action=null;
Ответ 8
Я предлагаю иметь значение None = 0 в качестве вашего первого значения перечисления. Сделайте это явным, тогда вы точно знаете, что это такое.
Ответ 9
По умолчанию только ссылочные типы - это типы с нулевым значением. Если вы хотите, чтобы переменная разрешала nulls, вы должны определить ее как nullable с помощью параметра?? (для этого вам нужно С# 2.0 или выше).
enum MyEnum
{
ValueOne,
ValueTwo
}
и в вашем классе
MyEnum? myvariable = null;
Ответ 10
Мой учитель С++ в колледже (11 лет назад) сказал мне, что компоновщик заменяет enum своим фактическим типом:
typedef static const int enum;
Таким образом, каждый раз, когда вы пишете что-то вроде enum MY_VAL = 5;
, вы можете легко заменить на static const int MY_VAL = 5;
(но это просто заставляет ваш код дольше...).
В любом случае значение по умолчанию для любого int
равно 0.