枚举的初始值

我有一个属性是一个枚举类

枚举是

/// <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中的第一个项目,而不是一个空值,这是如何枚举的工作? 怎么可能确保枚举得到某种空值,如果它没有设置,我不希望它默认枚举的第一个值。

enumtypes的默认值是0 (默认情况下,枚举中的第一个元素)。 一个类的字段将被初始化为默认值。

如果您需要在枚举中表示一个未知值,则可以添加值为0的元素。或者,您可以将该字段声明为Nullable<MyEnum>Nullable<MyEnum>MyEnum? )。

枚举是一个值types,就像整数。 您需要使其可以为空,以便不默认第一个(或0定义)的枚举成员。

 public class MyClass { public EnumDeliveryAction? DeliveryAction { get; set;} } 

枚举字段初始化为零; 如果你没有在枚举中指定值,它们从零开始( Email = 0SharePoint=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。