2

オブジェクトの処理が終了したら、usingディレクティブ、またはdisposeディレクティブのどちらが優れていますか?

 using(FileStream fileStream = new FileStream(
            "logs/myapp.log",
            FileMode.Open,
            FileAccess.Read,
            FileShare.ReadWrite))
        {
            using(StreamReader streamReader = new StreamReader(fileStream))
            {
                this.textBoxLogs.Text = streamReader.ReadToEnd();
            }
        }

一方、System.Net.Mailを処理しているときは、オブジェクトのDispose()を実行して、漂遊ロックを解放する必要があると言われます。

一貫したガイダンスはありますか?特定のオブジェクトに対して、特定の状況で何がより適切であるかをどのように判断できますか?

4

8 に答える 8

9

usingステートメント(ディレクティブではない)にはDispose()、finallyブロックでの暗黙の呼び出しが含まれます。したがって、ここに矛盾はありません。その議論にリンクできますか?

の公式定義
using (x) { ... }

try ... finally if (x != null) x.Dispose(); }

何が良いですか?

表記の観点から、using() { }ブロック。技術的には同じです。

于 2010-08-24T20:54:15.663 に答える
6

それは同じことです。使用法は簡単です。オブジェクトを作成し、それを1つのメソッドでのみ使用する場合は、usingを使用します。メソッド呼び出しを超えて存続させる必要がある場合は、Dispose()を使用する必要があります。

COMオブジェクトのランタイム呼び出し可能ラッパーには、Dispose()メソッドがありません。

于 2010-08-24T20:55:18.830 に答える
5

オブジェクトをブロックでラップできる場合Dispose()の別の実装Dispose()(たとえば、を実装するために作成したクラス)を除いて、手動で呼び出すことを考える理由はありません。usingブロックは、オブジェクトの作成と破棄をtry / catch / finalyブロックに入れて、オブジェクトが正しく破棄されることをほぼ保証します。IDisposableusing

コンパイラは私よりも信頼できます。もしくは、あなた。=)

MSDNは、usingステートメントを文書化し、usingステートメントとその方法の包括的な説明を提供するセクション8.13「usingステートメント」(少なくともv4.0リファレンスでは8.13)を確認できるC#言語仕様を入手できる場所を呼び出します。それを使用します。5番目の段落は次のようになります。

usingステートメントは、取得、使用、および廃棄の3つの部分に変換されます。リソースの使用法は、finally句を含むtryステートメントで暗黙的に囲まれています。このfinally句は、リソースを破棄します。nullリソースが取得された場合、Disposeの呼び出しは行われず、例外はスローされません。

于 2010-08-24T20:58:15.250 に答える
3
using(foo) 
{
    foo.DoStuff();
}

これは単なる構文糖衣です:

try
{
    foo.DoStuff();
}
finally
{
    if(foo != null)
        foo.Dispose();
}

ですから、議論がどこから来ているのかわかりません。usingブロックはdisposeを呼び出します。ほとんどの人usingは、何が起こっているかについてよりクリーンで明確であるため、可能な場合はブロックを好みます。

于 2010-08-24T20:56:09.857 に答える
3

オブジェクトの存続期間がコードのブロック内にあるusing限り、オブジェクトを長期間存続させる必要がある場合、たとえば、手動で呼び出す必要がある非同期呼び出しの後に破棄する場合は、を使用しますDispose

ブロックは、実行がコードのusingブロックを残す可能性のあるすべての可能な方法と不可能な方法でDisposeの呼び出しを覚えているよりもはるかに優れています。

于 2010-08-24T20:57:35.097 に答える
2

呼び出しを使用して終了時に破棄します。disposeの呼び出しが保証されるため、使用する方が適切です。

于 2010-08-24T20:53:24.477 に答える
2

usingDispose()ブロックの終わりに達すると、ブロックは自動的に呼び出します。

于 2010-08-24T20:53:50.703 に答える
1

「usingステートメント」を可能な限り使用する非常に重要な理由が1つあります。

usingステートメントを介してラップされたコードが例外をスローした場合、「usingオブジェクト」が破棄されることを確信できます。

于 2010-08-24T22:10:31.023 に答える