枚举的初始值
我有一个属性是一个枚举类
枚举是
/// <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 }
当我创build这个类的实例,在代码中的NOWHERE,我指定的枚举字段的值,但它似乎默认为enumlist中的第一个项目,而不是一个空值,这是如何枚举的工作? 怎么可能确保枚举得到某种空值,如果它没有设置,我不希望它默认枚举的第一个值。
enum
types的默认值是0
(默认情况下,枚举中的第一个元素)。 一个类的字段将被初始化为默认值。
如果您需要在枚举中表示一个未知值,则可以添加值为0的元素。或者,您可以将该字段声明为Nullable<MyEnum>
为Nullable<MyEnum>
( MyEnum?
)。
枚举是一个值types,就像整数。 您需要使其可以为空,以便不默认第一个(或0定义)的枚举成员。
public class MyClass { public EnumDeliveryAction? DeliveryAction { get; set;} }
枚举字段初始化为零; 如果你没有在枚举中指定值,它们从零开始( 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); }
最好的做法(根据代码分析的build议)是在你的枚举中总是有一个默认值,它代表一个未设置的值。
所以在你的情况下,你可能有:
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;
枚举是值types。 值types不能为空,并且初始化为0。
即使你的枚举没有0,枚举variables也会被初始化为0。
public enum SomeEnum { A = 1, B = 2 }
(后来)
SomeEnum x = default(SomeEnum); Console.WriteLine(x);
输出 – 0
有些回答者主张使用Nullable<T>
来匹配您的初始化期望。 由于Nullable<T>
仍然是一个值types,并且具有与引用types不同的语义,所以与此build议保持一致。 例如,它永远不会生成一个空引用exception(它不是一个引用)。
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"); }
你可以以任何值(比如1)开始你的枚举,但是当它们代表数据库中的查找值时,你通常希望它们匹配。
按照.Net框架devise指导原则,我通常将第一个Enum声明为None(= 0)。
传统的将null添加到通常不具有值的值的方法是将variables声明为可空types,即:
EnumDeliveryAction? action=null;
我build议有一个值None = 0作为你的第一个枚举值。 明确地说,那么你肯定知道它的价值是什么。
默认情况下,只有引用types是可以为空的types。 如果你想要一个variables来允许null,你必须使用“?”来定义它为空。 字符(为此,您需要C#2.0或更高版本)。
enum MyEnum { ValueOne, ValueTwo }
并在你的class级
MyEnum? myvariable = null;
我在大学的C ++老师(11年前)告诉我,链接器用它们的实际typesreplaceenum:
typedef static const int enum;
因此,任何时候你写东西像enum MY_VAL = 5;
,你可以很容易地用static const int MY_VAL = 5;
replacestatic const int MY_VAL = 5;
(但这只是让你的代码更长…)。
无论如何,任何int
的默认值是0。