使用enum
实例化new
时,C#的编译器不会抱怨:
enum Foo
{
Bar
}
Foo x = new Foo();
x
将是Foo
,其值为Bar
。
new Foo()
是否有任何我不知道的用途?或者我只是拳击并立即取消装箱枚举值?
答案 0 :(得分:30)
new T()
是值类型时, T
不是装箱操作。它与default(T)
是一回事。 <{1}},Foo x = new Foo();
和Foo x = default(Foo)
都做同样的事情。
初始化值类型
Foo x = Foo.Bar;
-OR -
int myInt = new int();
使用new运算符调用特定类型的默认构造函数,并将默认值赋给变量。在前面的示例中,默认构造函数将值0分配给myInt。有关通过调用默认构造函数指定的值的更多信息,请参阅Default Values Table。
答案 1 :(得分:4)
在IL级别,Foo.Bar
和new 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.Bar
和new 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)