首页 文章

枚举的初始值

提问于
浏览
59

我有一个属性为枚举的类

枚举是

/// <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

    大学里的我的C老师(11年前)告诉我链接器将enum替换为他们的实际类型:

    typedef static const int enum;

    因此,无论何时编写 enum MY_VAL = 5; 之类的东西,都可以轻松地用 static const int MY_VAL = 5; 替换(但这只会让你的代码更长......) .

    无论如何,任何 int 的默认值都是0 .

  • 0

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

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

  • 0

    我建议将None = 0的值作为你的第一个枚举值 . 说清楚,然后你肯定知道它的 Value 是什么 .

  • 106

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

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

    枚举是值类型 . 值类型不能为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");
    }
    
  • 0

    将值添加到通常不具有的值的传统方法是将变量声明为可空类型,即:

    EnumDeliveryAction? action=null;
    
  • 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);
    }
    
  • 7

    默认情况下,只有引用类型是可空类型 . 如果您希望变量允许空值,则必须使用“?”将其定义为可为空 . 字符(为此你需要C#2.0或以上) .

    enum MyEnum
    {
        ValueOne,
        ValueTwo
    }
    

    在你的班上

    MyEnum? myvariable = null;
    
  • 9

    您可以以任何值(例如1)启动枚举,但是当它们表示数据库中的查找值时,通常希望它们匹配 .

    根据.Net框架设计指南,我通常会在有意义时将第一个Enum声明为None(= 0) .

  • 4

    最佳实践(根据代码分析的建议)是在枚举中始终具有默认值,表示未设置的值 .

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

    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;
    

相关问题