タイトル : Re: クラスの破棄について 投稿日 : 2009/05/12(Tue) 12:16 投稿者 : Hongliang
> 質問1.下記の認識(思い込み)の正誤を教えてください。 > ・Disposeメソッドが用意されていないクラスの破棄は = Nothing だけで良い。 その変数からのインスタンスへの参照を切っているだけで、 インスタンス自体の破棄にはなりません(そもそもマネージドオブジェクトは 明示的にインスタンスを破棄することはできません)。 そのインスタンスがほかから参照されていなければ、そのうち GC が片付けます。 大抵の場合、Nothing の代入に意味はありません。 メソッド内のローカル変数ならメソッドを抜けたときに自動的に参照が無くなります。 IDisposable でないクラスのインスタンスは、「何もしない」が正しい方法です。 // まあクラス次第では「これ呼び出さないと動作保証しないよ」なんてのもあるかも知れませんが。 > ・New()で生成したクラスはマネージドクラスである。 そうですね。 > ・マネージドクラスの破棄は = Nothing だけで良い。 二つ上のが回答です。 > ・Finalizeメソッドを呼んだだけではクラスの破棄は行われない。 > ・Finalizeメソッドはシステムから呼ばれるだけのものであり、APPから呼ぶことはあまり無い。 > (Newとの対比から、Newで生成/Finalizeで破棄と思い込んでいました) そもそも Finalize メソッドは明示的に呼び出せません。 フレームワークから呼び出されるだけのものです。 また大抵のクラスでファイナライザを実装する必要はありません。 直接アンマネージドリソースを持っているクラスのみがファイナライザを実装するぐらいです。 // .NET 2.0 からはハンドルをマネージドオブジェクトとしてラップできるクラスが用意されたため、 直接アンマネージドリソースを保持することもほとんど無くなりました。 > 質問2. > Profile.Dispose() > Profile = Nothing > のようにDisposeを実行した後での = Nothingは無意味ですよね? 上でも答えましたが、Dispose を呼ぼうが呼ぶまいが Nothing の代入は大抵無意味です。 |