用新实例化枚举是否有用?

时间:2013-02-28 20:41:52

标签: c#

使用enum实例化new时,C#的编译器不会抱怨:

enum Foo
{
    Bar
}

Foo x = new Foo();

x将是Foo,其值为Bar

new Foo()是否有任何我不知道的用途?或者我只是拳击并立即取消装箱枚举值?

3 个答案:

答案 0 :(得分:30)

new T()是值类型时,

T不是装箱操作。它与default(T)是一回事。 <{1}},Foo x = new Foo();Foo x = default(Foo)都做同样的事情。

Reference

  

初始化值类型

Foo x = Foo.Bar;
     

-OR -

int myInt = new int();
     

使用new运算符调用特定类型的默认构造函数,并将默认值赋给变量。在前面的示例中,默认构造函数将值0分配给myInt。有关通过调用默认构造函数指定的值的更多信息,请参阅Default Values Table

答案 1 :(得分:4)

在IL级别,Foo.Barnew Foo()之间没有区别。两者都将评估为同一组IL操作码

L_0001: ldc.i4.0 
L_0002: stloc.0 

这些操作转换为不同IL的唯一情况是new操作一般完成

void Method<T>() where T : struct {
  T local = new T();
}

Method<Foo>();

在这种特殊情况下,new将生成一组不同的操作码

L_0005: ldloca.s e3
L_0007: initobj !!T

除了这种有点深奥的差异外,Foo.Barnew Foo()之间没有实际差异

答案 2 :(得分:3)

请参阅MSDN's entry on the System.Enum Class,特别是标有实例化枚举类型的部分。

根据我的理解,创建Enum的实例会为您提供Enum的默认值(0)。

示例(直接来自MSDN文章):

public class Example
{
   public enum ArrivalStatus { Late=-1, OnTime=0, Early=1 };
   public static void Main()
   {
      ArrivalStatus status1 = new ArrivalStatus();
      Console.WriteLine("Arrival Status: {0} ({0:D})", status1);
   }
}
// The example displays the following output: 
//       Arrival Status: OnTime (0)