2011-01-20 10 views
5

...チルダをメソッド呼び出しの前に置いていますか?私は例を挙げて取り組んでいたと私はこれを見た

#if DEBUG 
    /// <summary> 
    /// Useful for ensuring that ViewModel objects are properly garbage collected. 
    /// </summary> 
    ~ViewModelBase() 
    { 
     string msg = string.Format("{0} ({1}) ({2}) Finalized", this.GetType().Name, this.DisplayName, this.GetHashCode()); 
     System.Diagnostics.Debug.WriteLine(msg); 
    } 
#endif 

は、私はちょうどそれが何を意味するのか不思議でした...それをGoogleに試みたが、いずれかの結果を得ることができませんでした。誰でも知っていますか?私はこれを掲示した後

おかげで

+0

[C#でチルダ(〜)の意味は何ですか?](http://stackoverflow.com/questions/188688/what-does-the-tilde-mean-in-c) –

+1

あなたの質問に答えます。 – SLaks

答えて

5

ViewModelBaseクラスのファイナライザです。収集前にガベージコレクタによって呼び出されます。

ので、それは実際に非常に有用ではありません。

a)のガベージコレクションが実際に動作しませんし、あなたがそれをテストする必要はありません。

b)通常の実行中に呼び出されたときにコードについては何も表示しません。ほとんどの場合、ガベージコレクタはメモリ圧迫があると判断したときに収集し、収集します。

ほとんどの場合、ガベージコレクタを気にする必要はありません。実際の問題が発生したときには、それについて心配してください。

また、私は、ファイナライザを使用しないでください。プログラムの残りの部分は、呼び出されたときにどの状態になるのかわからないためです。

7

これはfinalizerと呼ばれます。

GCスレッド上で、オブジェクトが収集される不確定な時点でガベージコレクタによって呼び出されます。

パフォーマンスヒットもあります。

通常、はありませんファイナライザを作成します。
ファイナライザは、ネイティブリソースを直接所有するクラス(SafeHandleを使用する場合を除きます)と特別なデバッグ用のトリックに使用されます。

2

ファイナライザ(ガベージコレクタによって呼び出される特別なメソッド)です。ファイナライザはのリソースがDispose()メソッドが呼び出されない場合でもIDisposableを実装するリソースを所有するように設計されています。

このクラスの作成者は、デバッグコードが100%明確ではないが、そのようなデバッグコードは通常、「ちょっとダミー、Dispose()を手動で呼び出すのを忘れた」という意味のためです。これはかなり一般的なデバッグ支援です(私はかなりのコードでそれを見てきました)。しかし、私はそれを自分で使用しません。

タイプのインスタンスに貴重なリソースが含まれている場合があります。終了するとすぐにDispose()を呼び出すことができます。著者のコードが行っていることは、「私がこのファイナライザに到達した場合、できるだけ早くDispose()を呼び出すことに失敗している」ということです。しかし、実際には実動コードでFinalizerを使用するのではありません。

+0

彼は生涯追跡のためにそれを使用しているようです。 – SLaks

+0

私はあなたが正しいと思います。タイプがIDisposableでなく、貴重なリソースを保持していない場合は、かなり無意味なデバッグコードのようです。 #if DEBUGファイナライザを追加してフォークを見たことは、ファイナライザが実行されないようにすることです(実際にはperfヒットを避けるために手動で処分するときは抑制する必要があります)。私はあなたがこのものを知っていることを知っている、ちょうど興味を持った人々のためにそれをスペルアウト:) –

関連する問題