Создается ли объект, если инициализатор выбрасывает? - PullRequest
5 голосов
/ 18 апреля 2011

Я читал Эта статья в блоге Джага Ригхала, и мне показалось, что то, что он предлагал, на самом деле не то же самое, что использование инициализатора объекта. Потом я понял, что точно не знаю.

Когда объект создается с инициализаторами объекта и одним из этих инициализаторов (возможно, исключение Null Reference) ... объект действительно создается? Это как исключение, которое выдается в конструкторе? Или объект полностью построен, а затем инициализирован?

Ответы [ 4 ]

3 голосов
/ 18 апреля 2011

Оператор инициализации объекта, такой как var x = new Foo { Property1 = 5};, будет реализован примерно так:

Foo temp = new Foo();
temp.Property1 = 5;
x = temp;

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

2 голосов
/ 18 апреля 2011

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

Так, например, этот код:

var obj = new Model {
   FirstName = reader[0].ToString(),
   LastName = reader[1].ToString(),
   Age = Convert.ToInt32(reader[2].ToString())
};

Переписан компилятором в:

var temp = new Model();
temp.FirstName = reader[0].ToString();
temp.LastName = reader[1].ToString();
temp.Age = Convert.ToInt32(reader[2].ToString())
var obj = temp;
1 голос
/ 18 апреля 2011

Объект будет построен, но инициализация не будет завершена.Инициализация - это просто трюк с компилятором;посмотрите на сгенерированный IL, и вы увидите то же самое в любом случае.Сообщение в блоге жалуется, что труднее сказать, по какой линии произошло исключение, но лично мне никогда не было так трудно.

0 голосов
/ 08 мая 2013

Вы все должны знать, что скомпилированный IL-код НЕ всегда один и тот же !!

Разница заключается в конфигурации сборки Debug / Release.

Посмотрите на отражатель, если вы мне не верите .....

...