Сначала проверьте, существует ли 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
Значение по умолчанию для типов enum
- 0
(по умолчанию это первый элемент в перечислении). Поля класса будут инициализированы значением по умолчанию.
Если вам нужно представить значение unknown в перечислении, вы можете добавить элемент Unknown
со значением 0. В качестве альтернативы , вы можете объявить поле как Nullable
( MyEnum?
).
Лучшая практика (согласно рекомендациям 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;
Поля перечисления инициализируются как нулевые; 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);
}
Перечисления - это тип значения, как и целые числа. Вам нужно сделать его допускающим значение NULL, чтобы не использовать по умолчанию первый (или определенный 0) член перечисления.
public class MyClass
{
public EnumDeliveryAction? DeliveryAction { get; set;}
}
Перечисления - это типы значений. Типы значений не могут быть нулевыми и инициализируются значением 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");
}
Традиционный подход к добавлению нуля к значениям, которые обычно не имеют его, заключается в объявлении вашей переменной типа, допускающего значение NULL, то есть:
EnumDeliveryAction? action=null;
Я бы предложил использовать значение None = 0 в качестве первого значения перечисления. Сделайте его явным, тогда вы точно узнаете, в чем его ценность.
Вы можете начинать свои перечисления с любого значения (например, 1), но когда они представляют значение поиска в базе данных, вы обычно хотите, чтобы они совпадали.
Обычно я объявляю сначала Enum как None (= 0), когда это имеет смысл, согласно руководящим принципам проектирования .Net Framework.
По умолчанию только ссылочные типы являются типами, допускающими значение NULL. Если вы хотите, чтобы переменная допускала значения NULL, вы должны определить ее как допускающую значение NULL с помощью символа "?" символ (для этого нужен C # 2.0 или выше).
enum MyEnum
{
ValueOne,
ValueTwo
}
и в вашем классе
MyEnum? myvariable = null;