5

Jag Reeghal のブログでこの記事を読んでいましたが、彼が提案していることは、オブジェクト初期化子を使用することと実際には同じではないように思えました。それから、私は本当によくわからないことに気づきました。

オブジェクト初期化子を使用してオブジェクトが構築され、それらの初期化子の 1 つがスローされると (おそらく Null 参照例外)、オブジェクトは実際に構築されますか? これは基本的に、コンストラクターでスローされる例外のようなものですか? それとも、オブジェクトは完全に構築されてから初期化されていますか?

4

4 に答える 4

3

のようなオブジェクト初期化ステートメントvar x = new Foo { Property1 = 5};は、次のように実装されます。

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

ご覧のとおり、初期化子のプロパティはオブジェクトの構築後に設定されますが、すべてのプロパティが設定されるまで変数は完全に初期化されたオブジェクトに設定されないため、例外スローされると、構築されたオブジェクトは失われます例外がキャッチされた場合でも(変数は残るnullか、以前の値が何であれ)。

于 2011-04-18T01:13:37.263 に答える
2

最初に完全に構​​築され、次に初期化されます。ただし、例外がスローされた場合、そのようなオブジェクトへの参照は取得されません。コンパイラは、参照が適切に初期化されたオブジェクトのみを参照できるようにします。これを保証するためにテンポラリを使用します。

たとえば、次のコードは次のようになります。

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;
于 2011-04-18T01:24:33.193 に答える
1

オブジェクトは構築されますが、初期化は完了しません。初期化は単なるコンパイラのトリックです。生成されたILを見ると、どちらの方法でも同じことがわかります。ブログの投稿では、例外が発生した行を特定するのが難しいと不満を漏らしていますが、個人的には、これほど難しいことはありませんでした。

于 2011-04-18T00:54:33.193 に答える