2011-01-11 10 views
0

私は、 "閉じる"機能を持つストリームのようなクラスを持っています。このクラスのインスタンスは、フィールド/属性に格納されます。時々私はこのインスタンスを新鮮なインスタンスに置き換える必要があります。残念ながら、私は誰かがまだオブジェクトの古いインスタンスを使用しているかどうかを知ることはできません(多くの多くの関数がこのフィールドをマルチスレッドで使用しています)。クラスを閉じることなくフィールドを上書きすることができます。 GCが閉じられていないオブジェクトを削除することはありますか?それともdispose関数で閉じることができますか?ガベージコレクタによってストリームが閉じられているとは思いますか?

ありがとうございました。

答えて

4

クラスはimplementingIDisposableであり、そのユーザーはusing statementでインスタンス化する必要があります。

これにより、正しい閉鎖/廃棄が保証されます。

GCはまだ参照されているクラスを閉じたり破棄したりしないため、実際には作成したコードとそのクラスの使用方法によって異なります。

+0

OPのクラスでも、ストリームクラスと同様にClose()メソッドが公開されているわけではありません。 –

+0

@Aaron - これはおそらく_can_と思っています'dispose'実装は終了を保証する必要があります。しかし、正しいことをするためにコードのユーザーに頼ることは面白いバグにつながります。 – Oded

+0

残念ながら、それは廃棄パターンに必要なものです。GC以外にもメモリ以外のリソースを追跡するのではなく、コードのユーザーがクリーンアップを保証するために特別な手順( 'using'ステートメントなど)を取らせることを除いて、アンマネージドリソースがクリーンアップされることを保証する方法はありません。 – siride

1

あなただけ Disposeメソッドでそれを閉じることができませんが、あなたが最も好きなストリームとして、それを閉じるためにを持っているは、ガベージコレクタがの世話をすることはできませんアンマネージリソースを、含まれています。常にDisposeのクラスが実装されている場合は、IDisposableを実装しています。

クラス内でIDisposableを実装しているクラスを使用する場合は、そのクラスもインターフェイスを実装する必要があります。

1

FileStreamなどFinalize()メソッドがあります。これはDispose()を呼び出すだけです。ハンドルが最終的に閉じられることが保証されているのは事実ですが、確定的ではありません。手動でストリームを手動で閉じることができれば、これが非常に望ましい方法です。 Finalize()メソッドは、何らかの形でストリームが手動で閉じられない場合(通常はロジックの不具合のため)にのみ存在します。

このように、Finalize()メソッドであっても、100%保証されているわけではありません。ただし、プログラムが終了すると、すべてのハンドルはOSによって閉じられます。

0

クラスにファイナライザがある場合は、はいです。しかし、あなたの説明を考えれば、それは重要なことではありません。

ほとんどの場合、クラスにはIDisposableを実装する必要があるため、可能な限り早い時期にアンマネージリソース(または所有する使い捨てインスタンス)をリリースすることができます。

しかし、より大きな設計上の問題があるようです。フィールドを制御できるとすれば、を知っている必要があります。新しいインスタンスを作成したり、いつ廃棄するかは安全です。どうやら、そのインスタンスの明確な所有権を持っているものがなくても、スレッド間でいくつかの共有インスタンスがあるようです。コードや詳細な説明がなければ、私は間違っている可能性がありますが、起こるのを待っている事故のように聞こえます。

関連する問題