1

usingC# のキーワードに関する多くのスレッドを読みましたが、同じ質問を持つ人を見つけることができませんでした。この興味深い記事を読むと、using ステートメントは基本的に try/catch ブロックと同等であることがわかります。

MyResource myRes= new MyResource();
try
{
    myRes.DoSomething();
}
finally
{
    // Check for a null resource.
    if (myRes!= null)
        // Call the object's Dispose method.
        ((IDisposable)myRes).Dispose();
}

本当に私を怒らせるのは、オブジェクトの初期化myRes= new MyResource()がまだ try/catch ブロックの外にあるということです。そのため、初期化中に何か問題が発生した場合 (ああ、そうです!) 通常の try を使用する以外にそれを処理する方法はありません。 /キャッチブロック。

これは正しいですか、何か不足していますか? 私の意見では、これはusingステートメントの意味を部分的に役に立たなくします。

私も次のようなことを試しました:

using (MyResource myRes)
{
    myRes = new MyResource();
    myRes.DoSomething();
}

しかし、コンパイラはこれを好まないため、初期化を try ブロック内に持ち込むことはできません。

これは私にはとても奇妙に思えるので、何かが欠けているに違いないと思います。この背後にある理由を誰か説明してもらえますか?

4

1 に答える 1

3

コンストラクターが失敗した場合、参照が返される代わりに例外がスローされるため、呼び出し元のコードには破棄するものがありません。

基本的にコンストラクタは注意が必要です。例外で例外がスローされた場合、コンストラクターはリソースがリークしていないことを確認する必要があります。これは、他にクリーンアップする機会がないためです。

于 2013-10-17T16:25:14.503 に答える