enum
usingをインスタンス化しても、C# のコンパイラは文句を言いませんnew
。
enum Foo
{
Bar
}
Foo x = new Foo();
x
その後、Foo
with valueになりますBar
。
new Foo()
私が気付いていない用途はありますか?それとも、列挙値をボックス化してすぐにボックス化解除していますか?
enum
usingをインスタンス化しても、C# のコンパイラは文句を言いませんnew
。
enum Foo
{
Bar
}
Foo x = new Foo();
x
その後、Foo
with valueになりますBar
。
new Foo()
私が気付いていない用途はありますか?それとも、列挙値をボックス化してすぐにボックス化解除していますか?
new T()
T
が値型の場合、ボックス化操作ではありません。と同じですdefault(T)
。Foo x = new Foo();
、Foo x = default(Foo)
、およびFoo x = Foo.Bar;
すべてがまったく同じことを行います。
参考:
値の型の初期化
int myInt = new int();
–または–</p>
int myInt = 0;
new 演算子を使用すると、特定の型の既定のコンストラクターが呼び出され、既定値が変数に割り当てられます。前の例では、既定のコンストラクターが値 0 を myInt に割り当てました。デフォルト コンストラクターの呼び出しによって割り当てられる値の詳細については、「デフォルト値の表」を参照してください。
Foo.Bar
IL レベルでは、 と の間に違いはありません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
Foo.Bar
このやや難解な違いを除けば、 と の間に実際的な違いはありません。new Foo()
System.Enum Class に関する MSDN のエントリ、特にInstantiating an Enumeration Typeというラベルの付いたセクションを参照してください。
私が理解していることから、 のインスタンスを作成すると、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)