我有一个属性为枚举的类
枚举是
/// <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时,我是否指定枚举字段的值,但它似乎默认为枚举列表中的第一项,而不是空值,这是如何枚举的工作?如果枚举没有设置,如何确保枚举得到某种空值,我不希望它默认为枚举中的第一个值。
答案 0 :(得分:107)
enum
类型的默认值为0
(默认情况下,枚举中的第一个元素)。类的字段将初始化为默认值。
如果您需要在枚举中表示未知值,则可以添加值为{0}的元素Unknown
。或者,您可以将该字段声明为Nullable<MyEnum>
( MyEnum?
)。
答案 1 :(得分:9)
枚举是一种值类型,如整数。您需要使其可为空,以便不默认为第一个(或0定义的)枚举成员。
public class MyClass
{
public EnumDeliveryAction? DeliveryAction { get; set;}
}
答案 2 :(得分:7)
枚举字段初始化为零;如果您未在枚举中指定值,则它们从零开始(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);
}
答案 3 :(得分:7)
最佳实践(根据代码分析的建议)是在枚举中始终有一个默认值,表示未设置的值。
所以在你的情况下,你可能有:
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;
答案 4 :(得分:4)
枚举是值类型。值类型不能为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");
}
答案 5 :(得分:1)
您可以以任何值(例如1)开始您的枚举,但是当它们代表数据库中的查找值时,您通常希望它们匹配。
根据.Net框架设计指南,我通常会在有意义时将第一个Enum声明为None(= 0)。
答案 6 :(得分:0)
将null添加到通常不具有null的值的传统方法是将变量声明为可空类型,即:
EnumDeliveryAction? action=null;
答案 7 :(得分:0)
我建议将None = 0的值作为你的第一个枚举值。说清楚,然后你肯定知道它的价值是什么。
答案 8 :(得分:0)
默认情况下,只有引用类型是可空类型。如果您希望变量允许空值,则必须使用“?”将其定义为可为空。字符(为此你需要C#2.0或以上)。
enum MyEnum
{
ValueOne,
ValueTwo
}
并在你的班级
MyEnum? myvariable = null;
答案 9 :(得分:0)
大学里的我的C ++老师(11年前)告诉我,链接器将枚举替换为实际类型:
typedef static const int enum;
因此,只要您编写enum MY_VAL = 5;
之类的内容,就可以轻松地将其替换为static const int MY_VAL = 5;
(但这会让您的代码更长......)。
无论如何,任何int
的默认值都是0.