int
является структурой, поэтому, когда вы определяете Int в C# это технически инициализируется это значение по умолчанию (ноль). Однако это лучшая практика для инициализации значения на поле так, самый эквивалент трех вариантов, которые вы перечислили, является третьим один: Int myInt = 0
Вы не можете назначить структуры (тип значения), чтобы null
как это не- нулевой тип.
Есть способы иметь nullable structs (Nullable<T>
), но это не то, о чем вы просите.
MSDN on default values
UPDATE:
Как мой пост имеет некоторые комментаторы, которые разделяют смешанные результаты, я полагал, что я бы разработать percieved падение производительности при инициализации типы значений на delcaration вместо того, когда вы нуждаетесь в них ,
при оптимизации сборки (без nop
команд в коде IL) вы не увидите инициализацию, если вы устанавливаете его значение по умолчанию, это тестовый код:
class initfield
{
public int mynum = 0;
}
class noinitfield
{
public int mynum;
}
и это является IL для классов и их вызов (извините, если это выходит за рамки вопроса):
с инициализацией:
.class private auto ansi beforefieldinit test.initfield
extends [mscorlib]System.Object
{
// Fields
.field public int32 mynum
// Methods
.method public hidebysig specialname rtspecialname
instance void .ctor() cil managed
{
// Method begins at RVA 0x2087
// Code size 7 (0x7)
.maxstack 8
IL_0000: ldarg.0
IL_0001: call instance void [mscorlib]System.Object::.ctor()
IL_0006: ret
} // end of method initfield::.ctor
} // end of class test.initfield
без initiali зация:
.class private auto ansi beforefieldinit test.noinitfield
extends [mscorlib]System.Object
{
// Fields
.field public int32 mynum
// Methods
.method public hidebysig specialname rtspecialname
instance void .ctor() cil managed
{
// Method begins at RVA 0x208f
// Code size 7 (0x7)
.maxstack 8
IL_0000: ldarg.0
IL_0001: call instance void [mscorlib]System.Object::.ctor()
IL_0006: ret
} // end of method noinitfield::.ctor
} // end of class test.noinitfield
теперь, если вы перекомпилировать, что IL-код обратно в C# для класса, который был инициализации поля:
internal class initfield
{
public int mynum;
}
, как вы можете видеть, что компилятор оптимизирует избыточную инициализацию значение по умолчанию. Обратите внимание, что это относится только к примитивным типам, поэтому datetime не оптимизируется. - В случае заданного вопроса int myInt;
и int myInt = 0;
точно такие же.
первый не может быть прав cz int тип значения и тип значения не может быть нулевым, но он может сделать значение null, если вы разрешите его с помощью NULL, как 'int? myInt = NULL' –
Если вы посмотрите на это: http://stackoverflow.com/questions/5746873/where-and-why-use-int-a-new-int, это должно быть «int myInt = 0;» – sdeep