Для типов значений, варианты, практически говоря, эквивалентны.
Однако я был заинтригован эмпирическим исследованием Джона Скита , в котором «инструкции»привести к вызову конструктора по умолчанию без параметров, если он указан в CIL (вы не можете сделать это в C #, потому что он не позволяет вам).Среди прочего он опробовал default(T)
и new T()
, где T
- параметр типа.Они оказались эквивалентными;ни один из них, казалось, не вызывал конструктор.
Но один случай (кажется), который он не пробовал, был default(Foo)
, где Foo
- фактический тип структуры.
Так что явзял его код для взломанной структуры и попробовал это для себя.
Оказывается, что default (Foo) не вызывает конструктор, тогда как new Foo () на самом делеdo.
Использование типа структуры Oddity
, который задает конструктор без параметров:
При отключенной оптимизации , метод:
private void CallDefault()
{
Oddity a = default(Oddity);
}
производит CIL (без nop
с, ret
с и т. Д.):
L_0001: ldloca.s a
L_0003: initobj [Oddity]Oddity
, тогда как метод:
private void CallNew()
{
Oddity b = new Oddity();
}
производит:
L_0001: ldloca.s b
L_0003: call instance void [Oddity]Oddity::.ctor()
При включенных оптимизациях компилятор, по-видимому, оптимизирует все метода CallDefault
в бездействие, но сохраняет вызов конструктора в CallNew
(для потенциальных побочных эффектов?).