2014-11-20 4 views
0

Какой C# утверждение эквивалентно следующему:В чем разница между «int myInt;» и "int myInt = 0;"

int myInt = new int(); 

Я нашел этот вопрос на http://smarterer.com. Сайт smarterer.com предложить 3 ответов:

  • int myInt = NULL;
  • int myInt;
  • int myInt = 0;

Я знаю, что первое утверждение неверно. Но как насчет двух других. Мой вопрос сейчас в чем разница между int myInt; и int myInt = 0;? Для меня это одно и то же.

+1

первый не может быть прав cz int тип значения и тип значения не может быть нулевым, но он может сделать значение null, если вы разрешите его с помощью NULL, как 'int? myInt = NULL' –

+0

Если вы посмотрите на это: http://stackoverflow.com/questions/5746873/where-and-why-use-int-a-new-int, это должно быть «int myInt = 0;» – sdeep

ответ

9

Второе утверждение зависит от контекста. Если это объявление поля, то это ничем не отличается от назначения 0, потому что члены типа всегда инициализируются. Если это локальная переменная, то второй оператор не инициализирует переменную; потребуется, чтобы он был инициализирован позже, прежде чем использовать его.

Вы не можете назначить NULL что-то типа int, так что очевидно, что первый ответ неверен. :)

Я бы выбрал третий ответ, потому что он наиболее надежно, используя new int().

+0

Я тоже поклонник третьего. Меньше проблем. – C4u

0

В C# значение по умолчанию для типа данных используется новым оператором. int myint=new int(); заявление оказывает такой же эффект, как int myInt = 0;

См http://msdn.microsoft.com/en-us/library/83fhsxwc.aspx

+0

Этот ответ технически немного сбивает с толку (и я подозреваю * не полностью правильно *): Значение по умолчанию зависит от того, какой объект является значением или ссылочным типом, а также я сомневаюсь, что компилятор генерирует «новый T 'для каждой декларации поля (мне понадобятся некоторые спецификации здесь). –

1

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; точно такие же.

+1

«Однако лучше всего инициализировать значение в поле» ... У меня проблемы с этим из-за [проблем с производительностью] (http://blog.codinghorror.com/for-best-results-dont- initialize-variables /) и [* official * best practice] (http://stackoverflow.com/questions/24551/best-practice-initialize-class-fields-in-constructor-or-at-declaration) –

+0

хорошо, что сообщение также указывает, что если ваш конструктор будет манипулировать значением или установить его иначе, чем инициализатор поля, тогда вы должны установить его в свой конструктор - вопрос задает только значения по умолчанию. Ваш комментарий к производительности относится к .NET 2.0 и 1.1 - и да, пока он технически не нужен, в .NET 4+ нет производительности, потому что компилятор оптимизирует это для вас. – tophallen

+0

"хорошо, что сообщение также указывает, что если ваш конструктор будет манипулировать значением или установить его иначе, чем инициализатор поля будет" - не верно: * Создание объекта и инициализация по определению * –

Смежные вопросы