的C#编译器不会抱怨:那么是否有任何用新实例化枚举?当您使用<code>new</code>实例化一个<code>enum</code>
enum Foo
{
Bar
}
Foo x = new Foo();
x
将是一个Foo
与价值Bar
。
请问new Foo()
有什么用处我不知道?或者我只是拳击,并立即拆开枚举值?
的C#编译器不会抱怨:那么是否有任何用新实例化枚举?当您使用<code>new</code>实例化一个<code>enum</code>
enum Foo
{
Bar
}
Foo x = new Foo();
x
将是一个Foo
与价值Bar
。
请问new Foo()
有什么用处我不知道?或者我只是拳击,并立即拆开枚举值?
new T()
,当T
是一个值类型,不是一个装箱操作。这与default(T)
是一样的。 Foo x = new Foo();
,Foo x = default(Foo)
和Foo x = Foo.Bar;
都做完全相同的事情。
初始化值类型
int myInt = new int();
- 或 -
int myInt = 0;
使用new运算符调用特定类型的默认构造函数和指定缺省值给变量。在前面的示例中,默认构造函数将值0赋予myInt。有关通过调用默认构造函数分配的值的更多信息,请参见Default Values Table。
参见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)
在一个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
除了这个有点深奥的差异之外,012之间没有实际区别和new Foo()
值得指出的是:它仍然不是'new',而是:'default(T)'用一般方法编译成与我完全相同的'ldloca.s' /'initobj'。 – hvd 2013-02-28 21:35:45
值得注意的是'Foo x = new Foo()'不会自动创建'Foo'。它只会在值为0的时候初始化一个foo。看一看:http:// ideone。com/4Oj54P – 2013-02-28 20:57:17
@TimSchmelter,我认为枚举不能为空。如果0没有一个,Foo会是什么? – 2013-02-28 21:06:58
@AshBurlaczenko:看看ideone链接。它不是null,它的类型是'FooBar',但它有点不确定。所以我们应该总是明确地创建一个枚举变量。 – 2013-02-28 21:11:27