枚举的初始值

JL.*_*JL. 61 c# enums

我有一个属性是enum的类

枚举是

/// <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
  }
Run Code Online (Sandbox Code Playgroud)

当我在代码中创建此类的实例NOWHERE时,我是否指定枚举字段的值,但它似乎默认为枚举列表中的第一项,而不是空值,这是枚举的工作原理吗?如果枚举没有设置,如何确保枚举得到某种空值,我不希望它默认为枚举中的第一个值.

Meh*_*ari 110

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

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

  • 这是合乎逻辑的违法行为.但这不是重点.回到正轨,如果你的`enum`中没有名为None的元素,FxCop会抱怨.大概这是你默认的0值.进入的好习惯. (8认同)
  • 查尔斯:不是*非法*.在C#中(与Java不同),将枚举值置于定义范围之外被认为是合法的. (3认同)
  • @LeakyCode,恕我直言,“NotSet”而不是“Unknown”是更好的选择。 (2认同)

Jos*_*off 10

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

public class MyClass
{
   public EnumDeliveryAction? DeliveryAction { get; set;}
}
Run Code Online (Sandbox Code Playgroud)


Mar*_*ell 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
}
Run Code Online (Sandbox Code Playgroud)

您还应该确保永远不会将您的上一个预期值视为默认值; 即

switch(action) {
    case EnumDeliveryAction.Email; RunEmail(); break;
    default: RunSharePoint(); break;
}
Run Code Online (Sandbox Code Playgroud)

这应该是:

switch(action) {
    case EnumDeliveryAction.Email; RunEmail(); break;
    case EnumDeliveryAction.SharePoint; RunSharePoint(); break;
    default: throw new InvalidOperationException(
          "Unexpected action: " + action);
}
Run Code Online (Sandbox Code Playgroud)


Win*_*ith 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
  }
Run Code Online (Sandbox Code Playgroud)

顺便说一句,你不应该在枚举的名称前加上Enum.您可以考虑更改为:

public enum DeliveryAction;
Run Code Online (Sandbox Code Playgroud)


Amy*_*y B 5

枚举是值类型。值类型不能为null,并且必须初始化为0。

即使您的枚举不为0,枚举变量也会被初始化为0。

public enum SomeEnum
{
    A = 1,
    B = 2
}
Run Code Online (Sandbox Code Playgroud)

(后来)

SomeEnum x = default(SomeEnum);
Console.WriteLine(x);
Run Code Online (Sandbox Code Playgroud)

输出-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");
}
Run Code Online (Sandbox Code Playgroud)