2011-02-03 10 views
4

私はファイナライザを持つクラスを持っています。しかし、私はいつもDispose()Dispose()と呼んでいるので、GC.SupressFinalize(this)が呼び出されているので、私のオブジェクトは実際には決してファイナライズキューに入れないと思います。ファイナライザは、クラスの別のユーザがDispose()を呼び出すことを忘れてしまった場合に、バックストップとしてそこにあります。Finalizerのパフォーマンスペナルティがない場合

ファイナライザが実装されていないと、オブジェクトが決してファイナライゼーションキューに入れられなくても、パフォーマンスの低下はありますか?

私は考えていましたが、のEffective C#:Second Editionでは、「決して呼び出されなくても、ファイナライザが存在するため、タイプ。"

答えて

2

ファイナライザが実装されていないにもかかわらず、オブジェクトが決してファイナライゼーションキューに入れられなくても、パフォーマンス上のペナルティはありますか?ユーザーがDispose()を呼び出さないとき

は、限り、あなたはこれを正しく実装して、あなたのオブジェクトにGC.SuppressFinalizeを呼び出すよう、「ペナルティ」のみ発生します。

「厳しい」ペナルティは、ほとんどの場合、実際にはそれほど厳しいものではありません。 finalizerがガベージコレクションプロセスを汚染している場合、短命のオブジェクトが多い場合は問題になりますが、ファイナライザを持つオブジェクトはまれに(全体的に)問題になることはほとんどありません。

+2

ファイナライザを使用したオブジェクトがまれであっても、保持されている参照に基づいてオブジェクトのGCを_lot_できません –

関連する問題