33

enumusingをインスタンス化しても、C# のコンパイラは文句を言いませんnew

enum Foo
{
    Bar
}

Foo x = new Foo();

xその後、Foowith valueになりますBar

new Foo()私が気付いていない用途はありますか?それとも、列挙値をボックス化してすぐにボックス化解除していますか?

4

3 に答える 3

33

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 に割り当てました。デフォルト コンストラクターの呼び出しによって割り当てられる値の詳細については、「デフォルト値の表」を参照してください。

于 2013-02-28T20:44:33.790 に答える
5

Foo.BarIL レベルでは、 と の間に違いはありません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()

于 2013-02-28T21:30:03.443 に答える
4

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)
于 2013-02-28T20:49:44.403 に答える