Начальное значение перечисления


У меня есть класс со свойством которых является перечисление

на перечисление

/// <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
  }

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

10 57

10 ответов:

значение по умолчанию enum типа 0 (который по умолчанию является первым элементом в перечислении). Поля класса будут инициализированы значением по умолчанию.

Если вам нужно представить неизвестный значение в перечислении, вы можете добавить элемент Unknown со значением 0. Кроме того, вы можете объявить поле как Nullable<MyEnum> (MyEnum?).

перечисления-это тип значения, например ints. Вам нужно сделать его nullable, чтобы не использовать по умолчанию первый (или 0-определенный) элемент перечисления.

public class MyClass
{
   public EnumDeliveryAction? DeliveryAction { get; set;}
}

поля перечисления инициализируются как ноль; если вы не указываете значения в перечислении, они начинаются с нуля (Email = 0,SharePoint=1, etc).

таким образом, по умолчанию любое поле, которое вы инициализируете, будет 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);
}

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

Так что в вашем случае, вы могли бы иметь:

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
  }

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

public enum DeliveryAction;

перечисления являются типами значений. Типы значений не могут быть null и инициализируются до 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's null!");
}
if (x > SomeEnum.B)
{
}
else
{
    Console.WriteLine("This runs even though you don't expect it to");
}

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

Я обычно объявляю первое перечисление как None (=0), когда это имеет смысл сделать, в соответствии с рекомендациями по проектированию .Net Framework.

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

EnumDeliveryAction? action=null;

Я бы предложил иметь значение None = 0 в качестве первого значения перечисления. Сделайте это явным, тогда вы точно знаете, что это такое.

по умолчанию только ссылочные типы типы nullable. Если вы хотите, чтобы переменная допускала нули, вы должны определить ее как nullable с помощью "?"характер (для этого вам нужен C# 2.0 или выше).

enum MyEnum
{
    ValueOne,
    ValueTwo
}

и в свой класс

MyEnum? myvariable = null;

мой учитель C++ в колледже (11 лет назад) сказал мне, что компоновщик заменяет перечисление их фактическим типом:

typedef static const int enum;

таким образом, любой раз, когда вы пишете что-то вроде enum MY_VAL = 5;, вы можете легко заменить на static const int MY_VAL = 5; (но это просто делает ваш код длиннее...).

в любом случае, значение по умолчанию любого int - Это 0.