Можно ли использовать экземпляр enum с новым?
Компилятор С# не жалуется, когда вы создаете экземпляр enum
с помощью new
:
enum Foo
{
Bar
}
Foo x = new Foo();
x
будет тогда Foo
со значением Bar
.
Имеет ли new Foo()
какое-либо использование, о котором я не знаю? Или я просто бокс и сразу unboxing значение перечисления?
Ответы
Ответ 1
new T()
, когда T
- тип значения, не является операцией бокса. Это то же самое, что и default(T)
. Foo x = new Foo();
, Foo x = default(Foo)
и Foo x = Foo.Bar;
все делают точно то же самое.
Ссылка:
Инициализация типов значений
int myInt = new int();
-или -
int myInt = 0;
Использование нового оператора вызывает конструктор по умолчанию для конкретного типа и присваивает значение по умолчанию переменной. В предыдущем примере конструктор по умолчанию присвоил значение 0 myInt. Дополнительные сведения о значениях, назначенных вызывающими конструкторами по умолчанию, см. В Таблица значений по умолчанию.
Ответ 2
На уровне IL нет разницы между Foo.Bar
и new Foo()
. Оба будут оценивать один и тот же набор опций кода IL
L_0001: ldc.i4.0
L_0002: stloc.0
Единственный случай, когда эти операции переводятся в разные ИЛ, - это когда операция new
выполняется в общем случае
void Method<T>() where T : struct {
T local = new T();
}
Method<Foo>();
В этом конкретном случае new
создаст другой набор op-кодов
L_0005: ldloca.s e3
L_0007: initobj !!T
Помимо этой несколько эзотерической разницы нет практической разницы между Foo.Bar
и new Foo()
Ответ 3
См. запись MSDN в классе System.Enum, особенно раздел с надписью Создание экземпляра типа перечисления.. p >
Из того, что я понимаю, создание экземпляра 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)