0

私が日常的に使用している (そして何度か書いた) 一部のコードでは、次のようなコードが使用されています。

using (StreamWriter sw = new FileWriter(".\SomeFile.txt"))
{
    // Perform file IO here...
}
finally
{
    sw.Close();
}

私は C# の try/catch/finally に精通しています... finally のコンテキストが機能することを知っています。「最終的に使用する」という用語でグーグル検索を実行したところ、関連する一致が見つかりませんでした。

Using ステートメントの最後のコマンドで、Finally ブロックの内容が実行される場合、私が考えているように、Finally のこのコンテキストは機能しますか? それとも、私 (および私が使用しているコード ベース) はこれをすべて間違っていますか? は Try/Catch に制限されていますか?

4

4 に答える 4

1

は Try/Catch に制限されていますか?

はいfinallyブロックの前にはブロックが必要tryです。のみcatchはオプションです。それに加えて、 scopeについて少し読む必要があります。swブロック内で宣言した変数は、そのブロックusingの外ではアクセスできません。

さらに、using( StreamWriteris FileWriterfrom Java ;-) ブロックがスコープ外になるとすぐに (つまり、そのブロックの最後の命令が実行されると) 破棄されるため、手動で破棄または閉じる必要はありません。

于 2012-07-18T14:01:36.833 に答える
1

最終的には常に実行されますが、現状のコードはほとんど冗長です。コード:

 using (StreamWriter sw = new FileWriter(".\SomeFile.txt"))
 {
     // Perform file IO here...
 }

機能的に同等です

 {
   StreamWriter sw = new FileWriter(".\SomeFile.txt");
    try {
       // Perform file IO here...
    }
    finally {
       ((IDisposable)sw).Dispose();
    }
 }

StreamWriter の Dispose() メソッドは暗黙的に Close() を呼び出します。ただし、ユーザー定義の Finals はシステム暗黙の Finals の前に実行されるため、これはエラーにはなりません。

于 2012-07-18T13:55:41.137 に答える
0

最後に、(キャッチされていない)例外があるかどうかに関係なく、常に機能します

于 2012-07-18T13:51:18.437 に答える
0

usingaがILに変換されると、とにかく.Net が ausingを a に変換すると信じています - したがって、このコンテキストではまだ意味があります。try

この記事を参照してください。

于 2012-07-18T13:52:34.700 に答える