我有一个属性为枚举的类
枚举是
/// <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时,我是否指定枚举字段的值,但它似乎默认为枚举列表中的第一项,而不是空值,这是枚举的工作原理吗?如果枚举没有设置,如何确保枚举获得某种空值,我不希望它默认为枚举中的第一个值 .
10 回答
大学里的我的C老师(11年前)告诉我链接器将enum替换为他们的实际类型:
typedef static const int enum;
因此,无论何时编写
enum MY_VAL = 5;
之类的东西,都可以轻松地用static const int MY_VAL = 5;
替换(但这只会让你的代码更长......) .无论如何,任何
int
的默认值都是0 .enum
类型的默认值是0
(默认情况下,它是枚举中的第一个元素) . 类的字段将初始化为默认值 .如果需要在枚举中表示未知值,可以添加值为0的元素
Unknown
. 或者,可以将该字段声明为Nullable<MyEnum>
(MyEnum?
) .我建议将None = 0的值作为你的第一个枚举值 . 说清楚,然后你肯定知道它的 Value 是什么 .
枚举是一种值类型,如整数 . 您需要使其可为空,以便不默认为第一个(或0定义的)枚举成员 .
枚举是值类型 . 值类型不能为null并初始化为0 .
即使你的枚举没有0,枚举变量也会被初始化为0 .
(后来)
输出 - 0
一些回答者主张使用
Nullable<T>
来匹配您的初始化期望 . 因为Nullable<T>
仍然是一个值类型并且具有与引用类型不同的语义,所以对此建议感到满意 . 例如,它永远不会生成空引用异常(它不是引用) .将值添加到通常不具有的值的传统方法是将变量声明为可空类型,即:
枚举字段初始化为零;如果您未在枚举中指定值,则它们从零开始(
Email = 0
,SharePoint=1
等) .因此,默认情况下,您自己初始化的任何字段都将为
Email
. 为这种情况添加None=0
是相对常见的,或者使用Nullable<T>
;即您还应该确保永远不会将您的上一个预期值视为默认值;即
这应该是:
默认情况下,只有引用类型是可空类型 . 如果您希望变量允许空值,则必须使用“?”将其定义为可为空 . 字符(为此你需要C#2.0或以上) .
在你的班上
您可以以任何值(例如1)启动枚举,但是当它们表示数据库中的查找值时,通常希望它们匹配 .
根据.Net框架设计指南,我通常会在有意义时将第一个Enum声明为None(= 0) .
最佳实践(根据代码分析的建议)是在枚举中始终具有默认值,表示未设置的值 .
所以在你的情况下,你可能有:
顺便说一句,你不应该在枚举的名称前加上Enum . 您可以考虑更改为: