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

Сначала проверьте, существует ли table / column (id / name) комбинация в dbo.syscolumns (внутренняя таблица SQL Server, которая содержит определения поля), и если не выпускают соответствующее ALTER TABLE запрос для добавления его. Например:

IF NOT EXISTS ( SELECT  *
            FROM    syscolumns
            WHERE   id = OBJECT_ID('Client')
                    AND name = 'Name' ) 
ALTER TABLE Client
ADD Name VARCHAR(64) NULL
61
задан John Saunders 26 December 2013 в 19:55
поделиться

9 ответов

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

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

110
ответ дан 24 November 2019 в 17:09
поделиться

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

Итак, в вашем случае вы можете иметь:

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. Вы можете подумать о том, чтобы перейти на:

public enum DeliveryAction;
7
ответ дан 24 November 2019 в 17:09
поделиться

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

Таким образом, по умолчанию любое поле, которое вы используете инициализировать себя будет Электронная почта . Относительно часто для таких случаев добавляют None = 0 или в качестве альтернативы используют Nullable ; т.е.

/// <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);
}
7
ответ дан 24 November 2019 в 17:09
поделиться

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

public class MyClass
{
   public EnumDeliveryAction? DeliveryAction { get; set;}
}
10
ответ дан 24 November 2019 в 17:09
поделиться

Перечисления - это типы значений. Типы значений не могут быть нулевыми и инициализируются значением 0.

Даже если в вашем перечислении нет 0, переменные перечисления будут инициализированы значением 0.

public enum SomeEnum
{
    A = 1,
    B = 2
}

(позже)

SomeEnum x = default(SomeEnum);
Console.WriteLine(x);

Выходы - 0


Некоторые ответчики имеют пропаганда использования Nullable для соответствия вашим ожиданиям инициализации. Будьте внимательны с этим советом, поскольку Nullable по-прежнему является типом значения и имеет другую семантику, чем ссылочные типы. Например, он никогда не будет генерировать исключение с нулевой ссылкой (это не ссылка).

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");
}
5
ответ дан 24 November 2019 в 17:09
поделиться

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

EnumDeliveryAction? action=null;
0
ответ дан 24 November 2019 в 17:09
поделиться

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

0
ответ дан 24 November 2019 в 17:09
поделиться

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

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

1
ответ дан 24 November 2019 в 17:09
поделиться

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

enum MyEnum
{
    ValueOne,
    ValueTwo
}

и в вашем классе

MyEnum? myvariable = null;
0
ответ дан 24 November 2019 в 17:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: