2013-02-28 42 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

相關問題