C# 用new实例化枚举有什么用吗?
当您使用C# 用new实例化枚举有什么用吗?,c#,C#,当您使用new实例化enum时,C#的编译器不会抱怨: enum Foo { Bar } Foo x = new Foo(); x将是一个Foo值为Bar new Foo()有我不知道的用途吗?还是我只是装箱并立即取消装箱枚举值?new T(),当T是值类型时,不是装箱操作。这与default(T)相同Foo x=新Foo(),Foo x=default(Foo),以及Foo x=Foo.Bar都做完全相同的事情 : 初始化值类型 int myInt = new int(); -或
new
实例化enum
时,C#的编译器不会抱怨:
enum Foo
{
Bar
}
Foo x = new Foo();
x
将是一个Foo
值为Bar
new Foo()
有我不知道的用途吗?还是我只是装箱并立即取消装箱枚举值?new T()
,当T
是值类型时,不是装箱操作。这与default(T)
相同<代码>Foo x=新Foo(),Foo x=default(Foo)
,以及Foo x=Foo.Bar代码>都做完全相同的事情
:
初始化值类型
int myInt = new int();
-或-
int myInt = 0;
使用新运算符调用特定类型的默认构造函数,并将默认值指定给变量。在前面的示例中,默认构造函数将值0分配给myInt。有关通过调用默认构造函数指定的值的更多信息,请参阅
请参阅,特别是标记为“实例化枚举类型”的部分
据我所知,创建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)
在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>();
除了这个有点深奥的区别之外,Foo.Bar
和new Foo()
之间没有实际的区别。值得注意的是,Foo x=new Foo()
不会自动创建Foo
。只有当有一个foo的值为0时,它才会初始化foo。看一看:@TimSchmelter,我以为枚举不能为空。如果0上没有,Foo会是什么?@Ashburaczenko:看看ideone链接。它不是null,它的类型是FooBar
,但它有点未定义。因此,我们应该始终明确地创建一个枚举变量。@TimSchmelternew Foo()
在Foo
为任何值类型时将始终为default(Foo)
,而对于enum
s,无论该值是否存在常量,该变量始终为(Foo)0
。它不是一种未定义的类型,枚举变量能够保存与任何常量(想想标志)不对应的值是正常的。对非引用类型的对象使用“new someEnumType()”似乎会混淆语言,有人能评论一下允许这样做的动机是什么吗?值得指出的是:它仍然不是新的,不同的是:default(T)
对我来说编译成完全相同的ldloca.s
/initobj
。
L_0005: ldloca.s e3
L_0007: initobj !!T