2009-07-22 143 views
54

我有这是一个枚举属性类枚举初值

枚举是

/// <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,我指定enum字段的值,但它似乎默认为enumlist中的第一个项目,而不是空值,这是枚举的工作方式?如何确保枚举获取某种空值(如果未设置),我不希望它默认为枚举中的第一个值。

+0

ENUM是一个值类型,而不是一个引用类型。引用类型默认为null,而值类型默认为一个值。即int默认为0,日期时间默认为最小日期,等等。 – contactmatt 2012-02-24 17:20:14

回答

103

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

如果需要表示在枚举的未知值,可以用值0添加元素Unknown或者,可以声明字段作为Nullable<MyEnum>MyEnum?)。

+0

那么我需要用1开始我的枚举第一个值吗? – 2009-07-22 13:51:40

+0

更新了答案以反映这一点。 – 2009-07-22 13:53:55

+1

除非你想默认值是undefined ..它仍然默认值为零,如果你的枚举没有值为零的成员,将是一个非法值。 – 2009-07-22 13:54:35

8

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

public class MyClass 
{ 
    public EnumDeliveryAction? DeliveryAction { get; set;} 
} 
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); 
} 
0

传统的形式给出,以添加空到不一般有一个是声明的变量可空类型值,即:

EnumDeliveryAction? action=null; 
0

我建议将值None = 0作为您的第一枚枚举值。明确地说,那么你肯定知道它的价值是什么。

1

您可以以任何值(例如1)开始枚举,但当它们代表数据库中的查找值时,通常希望它们匹配。

根据.Net框架设计指导原则,我通常将第一个Enum声明为None(= 0)。

6

最佳实践(根据代码分析的建议)应始终在您的枚举中有一个默认值,它表示未设置的值。

所以你的情况,你可能有:

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 
    } 

顺便说一句,你不应该前缀枚举枚举的名称。您可能会考虑更改为:

public enum DeliveryAction; 
0

默认情况下,只有引用类型是可为空的类型。如果你想要一个变量来允许空值,你必须使用“?”来将其定义为空值。字符(为此,您需要C#2.0或更高版本)。

enum MyEnum 
{ 
    ValueOne, 
    ValueTwo 
} 

和类

MyEnum? myvariable = null; 
3

枚举是值类型。值类型不能为空,初始化为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"); 
} 
0

我的C++老师在大学(11年前)告诉我,连接器替换枚举与他们的实际类型:

typedef static const int enum;

因此,你喜欢写东西enum MY_VAL = 5;,你可以在任何时间很容易替换为static const int MY_VAL = 5;(但这只是让你的代码更长......)。

无论如何,任何int的默认值为0。