的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