2

tryブロック内でオブジェクト変数を代入できないのはなぜですか?

これを実行してブロック内の変数をクリーンアップしようとすると、「割り当てられていないローカル変数の使用」finallyというコンパイラ エラーが発生します。変数はブロックの前に宣言されているため、これは意味がありません。ブロックでは、最初に変数が であるかどうかを確認しています。tryfinallynull

次のコードがコンパイルできないのはなぜですか? 割り当てられていない変数で何かをしようとする可能性がないdbcかどうかを確認しています。null

例えば:

DbConnection dbc;
try {
    dbc = <some method call returning an open DbConnection>
    // do stuff
} catch (Exception e) { // do stuff }
finally { 
    if (dbc != null) {
        dbc.Close();
    }
}
4

2 に答える 2

13

DbConnection dbc = null;変数が割り当てられていることをコンパイラが確実に認識できるように、宣言を に変更します。(単に宣言すること dbcは、null の値を割り当てることと同じではありません。ローカルで明示的に行う必要があります。)

既存のコードが失敗する理由は、dbc が設定される前に例外が発生する可能性が十分にあるためです。そのため、コンパイラは、finally ブロックが実行されるまでに dbc が割り当てられていると想定できません。

詳細については、明確な割り当てに関する言語仕様のセクション 5.3 を参照してください。

http://msdn.microsoft.com/en-us/library/aa691172(VS.71).aspx

于 2010-08-11T03:08:52.333 に答える
1

これを変える

DbConnection dbc;

これに

DbConnection dbc = null;
于 2010-08-11T03:10:25.230 に答える