Подтвердить что ты не робот

Начальное значение 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, но по умолчанию он по умолчанию относится к первому элементу в списке перечислений, а не к нулевому значению, так это перечисление Работа? Как можно гарантировать, что перечисление получает какое-то нулевое значение, если оно не установлено, я не хочу, чтобы оно по умолчанию было первым значением в перечислении.

4b9b3361

Ответ 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.