2013-02-28 53 views

回答

29

new T(),当T是一个值类型,不是一个装箱操作。这与default(T)是一样的。 Foo x = new Foo();Foo x = default(Foo)Foo x = Foo.Bar;都做完全相同的事情。

Reference

初始化值类型

int myInt = new int(); 

- 或 -

int myInt = 0; 

使用new运算符调用特定类型的默认构造函数和指定缺省值给变量。在前面的示例中,默认构造函数将值0赋予myInt。有关通过调用默认构造函数分配的值的更多信息,请参见Default Values Table

+2

值得注意的是'Foo x = new Foo()'不会自动创建'Foo'。它只会在值为0的时候初始化一个foo。看一看:http:// ideone。com/4Oj54P – 2013-02-28 20:57:17

+0

@TimSchmelter,我认为枚举不能为空。如果0没有一个,Foo会是什么? – 2013-02-28 21:06:58

+0

@AshBurlaczenko:看看ideone链接。它不是null,它的类型是'FooBar',但它有点不确定。所以我们应该总是明确地创建一个枚举变量。 – 2013-02-28 21:11:27

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) 
4

在一个IL水平有Foo.Barnew 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()

+1

值得指出的是:它仍然不是'new',而是:'default(T)'用一般方法编译成与我完全相同的'ldloca.s' /'initobj'。 – hvd 2013-02-28 21:35:45

相关问题