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

Mig*_*Mig 27 c#

当你实例化一个enumusing 时,C#的编译器不会抱怨new:

enum Foo
{
    Bar
}

Foo x = new Foo();
Run Code Online (Sandbox Code Playgroud)

x那将是Foo有价值的Bar.

请问new Foo()有什么用,我不知道的?或者我只是拳击并立即取消装箱枚举值?

小智 30

new T(),when T是值类型时,不是装箱操作.它是一样的default(T).Foo x = new Foo();,Foo x = default(Foo)Foo x = Foo.Bar;所有做同样的事情.

参考:

初始化值类型

int myInt = new int();
Run Code Online (Sandbox Code Playgroud)

-要么-

int myInt = 0;
Run Code Online (Sandbox Code Playgroud)

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

  • 值得注意的是,`Foo x = new Foo()`不会自动创建`Foo`.它只会在值为0的情况下初始化foo.看看:http://ideone.com/4Oj54P (4认同)
  • @TimSchmelter`new Foo()`总是`default(Foo)`当`Foo`是任何值类型,而`enum`s总是`(Foo)0`,无论是否为常数价值存在.它不是未定义的,枚举变量能够保存与任何常量不对应的值(想想标志)是正常的. (2认同)

Jar*_*Par 5

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

L_0001: ldc.i4.0 
L_0002: stloc.0 
Run Code Online (Sandbox Code Playgroud)

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

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

Method<Foo>();
Run Code Online (Sandbox Code Playgroud)

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

L_0005: ldloca.s e3
L_0007: initobj !!T
Run Code Online (Sandbox Code Playgroud)

除了这个有点深奥的区别之外,Foo.Barnew Foo()