当你实例化一个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;所有做同样的事情.
参考:
初始化值类型
Run Code Online (Sandbox Code Playgroud)int myInt = new int();-要么-
Run Code Online (Sandbox Code Playgroud)int myInt = 0;使用new运算符调用特定类型的默认构造函数,并将默认值分配给变量.在前面的示例中,默认构造函数将值0分配给myInt.有关通过调用默认构造函数指定的值的更多信息,请参阅默认值表.
在 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.Bar和new Foo()