3

C# の .Dispose() は C の free() と同等ですか?

ユーザーが選択したファイル名を取得した後、OpenFileDialog を .Dispose() する必要がありますか?

私のアプリケーションでは、ユーザーは好きなだけファイルを選択/開くことができます。それとも、.NET フレームワークの特定のアーキテクチャのために、それは悪い習慣でしょうか?

4

4 に答える 4

3

IDisposable を実装するものはすべて破棄する必要があります。通常、これはコンテキストを using ステートメントでラップすることを意味します。つまり、次のようになります。

using (var myInstanceOfSomeClass = new SomeClassImplementingIDisposable())
{
    // do stuff
}

これは、.Dispose() を呼び出す try/finally ブロックの C# 省略形です。

free() との関係に関しては、同じではないと思います。私のCは錆びていますが、 .Dispose() は、ファイルハンドル、データベース接続、メモリ割り当てなどの管理されていないリソースをクリーンアップできる、より一般的な実装です。特定のクラスに対して .Dispose() が正確に何をするかは、実装に依存します開発者による。

于 2013-10-31T17:26:33.987 に答える
2

いいえ。

dispose()オブジェクトに関連付けられたリソースを解放しますが、削除はしません。C# は、コードから使用できなくなったオブジェクトを削除する責任を持つガベージ コレクターを通じてオブジェクトを管理します。

インターフェースについて読んでくださいIDisposable

于 2013-10-31T17:26:12.090 に答える
-1

の目的はDispose、オブジェクトを破棄することではなく、オブジェクトに代わって何かを実行している可能性のある外部エンティティ (複数可) に、オブジェクトがその必要がなくなったことを通知できるようにすることです。たとえば、ファイルをカプセル化するオブジェクトは、そのオブジェクトへの排他的アクセスを許可するハンドルを OS に要求する場合があります。OS は、ハンドルを持つエンティティが不要であると言うまで、ハンドルのないエンティティがファイルにアクセスすることを許可しません。排他的アクセスが不要になったことを OS に通知せずにオブジェクトが存在しなくなった場合、OS は (おそらく不必要に) 少なくともアプリケーションが閉じられるまで、他のユーザーがファイルを使用できないようにします。

.NET Framework では、オブジェクトが予期せず放棄された場合に通知を要求できます。また、一部のオブジェクト (ところで、System.IO.File を含む) はそのような通知を使用して、外部エンティティにサービスが不要になることを知らせます。残念ながら、オブジェクトが放棄されてから (存在する場合) それが通知されるまでにどれくらいの時間が経過するかについて、一般的に保証はありません。たとえば、ファイルが不要になったことを最終的にシステムに認識させることは、ファイルを永久に保持するよりも優れている可能性がありますが、ファイルをすぐに閉じることははるかに優れています。

通常、ファイルを「破棄」するのではなく「閉じる」という観点から考えますが、IDisposable他のエンティティに代わりに何かを実行するように要求したほとんどの種類のオブジェクトに対してインターフェイスを一貫して使用すると、VB.NET と C# の両方で、using構造体を提供する

using var myFile = File.Open(whatever)
{
  myFile.doStuff();
}

これにより、終了時に、保護されたオブジェクトに代わって何かを開始したすべてのオブジェクトに、その必要がなくなったことを自動的に認識させます (VB.NET または C# はDispose保護されたオブジェクトを呼び出します。何を通知した)。Closeファイル、DeleteGDI オブジェクト、Releaseミューテックス、Shutdownデーモン サービスなどに必要な場合、usingステートメントが終了時に保護されたオブジェクトに対して何をすべきかを言語が認識するのは困難です。これらのいずれかを実行する単一のDisposeメソッドを使用すると、そのような構造が大幅に簡素化されます。

于 2013-10-31T18:04:52.673 に答える