枚举的初始值

时间:2009-07-22 13:49:28

标签: c# enums

我有一个属性为枚举的类

枚举是

/// <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 个答案:

答案 0 :(得分:107)

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

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

答案 1 :(得分:9)

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

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

答案 2 :(得分:7)

枚举字段初始化为零;如果您未在枚举中指定值,则它们从零开始(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);
}

答案 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.