Подтвердить что ты не робот

Разница между инициализацией объекта двумя способами в С#

обычно я instant initialize a object при добавлении его к list таким образом --- >

list.add(
   new foo() {                       //     <--- foo()
      field1 = value1,
      field2 = value2 
   }
);

но как только я просто попытался --- >

list.add(
   new foo {                     //     <--- foo
      field1 = value1,
      field2 = value2 
   }
);

& это сработало!!!

во втором случае я просто creating a object, не используя () в хвосте. так кто-нибудь имеет представление о различии между этими различными способами инициализации объекта?

4b9b3361

Ответ 1

так кто-нибудь имеет представление о различии между этими различными способами инициализации объекта?

Нет никакой разницы. В обоих случаях вы используете инициализатор объектов, и если вы не укажете каких-либо аргументов конструктора, что в точности эквивалентно предоставлению пустого списка аргументы конструктора. Из раздела 7.6.10.1 спецификации С#:

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

Обратите внимание, что когда вы просто вызываете конструктор без использования инициализатора объекта (фигурные скобки), вы должны указать аргументы конструктора. Итак:

Foo foo = new Foo();    // Valid
Foo foo = new Foo;      // Invalid
Foo foo = new Foo() {}; // Valid
Foo foo = new Foo {};   // Valid

"Действительные" строки все равно эквивалентны, включая использование параметров по умолчанию - поэтому Foo может иметь только такой конструктор:

// You can invoke this without specifying arguments
public Foo(int x = 0)
{
}

Более подробную информацию см. в разделе 7.6.10 спецификации С# 5.

Ответ 2

Они оба являются инициализаторами объектов. Нет никакой разницы. Это хороший вопрос. Я бы подумал, что за кулисами результат тот же... Компилятор создает объект с пустым конструктором и устанавливает свойства.

Ответ 3

Никакой разницы. В инициализаторе объекта второй формы (без круглых скобок) конструктор без параметров используется по умолчанию, но может быть указан явно. Если вы хотите передать параметры конструктору, вы должны использовать первую форму (с некоторыми значениями, очевидно).

Ответ 4

Как объяснено в основном, никакой разницы в обоих. Всякий раз, когда мы создаем объект, всегда существует конструктор по умолчанию, созданный без какого-либо параметра, который инициализирует членов объекта со значениями по умолчанию (empty/NULL), означает, что ваш второй метод будет использоваться. Но когда мы передаем параметр во время инициализации объекта, конструктор должен быть определен для определения соответствия, иначе он приведет к синтаксической ошибке. Если для определения соответствия не существует конструктора, то ничего не следует передавать как значения или инициализировать члены объекта.