2010-11-19 5 views
4

C#でデストラクタについて読んでいますが、まともなユースケースを見つけるのが難しいです。C#デストラクタの使用例

誰かが使用例と説明を提供できますか?

非常に高く評価されています。

更新
ブックのコードサンプルはDesctuctor及び廃棄()メソッドの両方が、本からこのコードスニペットを参照して実装します。

class MyClass 
{ 
    bool disposed = false; // Disposal status 
    public void Dispose() 
    { 
     Dispose(true); 
     GC.SuppressFinalize(this); 
    } 
    ~MyClass() 
    { 
     Dispose(false); 
    } 
    protected virtual void Dispose(bool disposing) 
    { 
     if (disposed == false) 
     { 
      if (disposing == true) 
      { 
       // Dispose the managed resources. Factored Dispose 

      } 
      // Dispose the unmanaged resources. 

     } 
     disposed = true; 
    } 
} 

マルコ

+0

http://www.devx.com/dotnet/Article/33167/0/page/2かなり良い記事... –

答えて

8

ファイナライザは、非常にはめったに必要ありません。彼らはネイティブリソースに直接アクセスしたときにを使用する必要がありましたが、現在は通常SafeHandleを使用してください。

ジョーダフィーは、私は自分自身を書くことができるようになるのではなく、より多くの細部に入るどのexcellent post about thisを持っている - ので、それを読んで行く:)

用語の簡単なメモ:C#の仕様のECMAバージョンをそれらを指し、ファイナライザとして。スペックのMicrosoftバージョンは常にそれらをデストラクターと呼んでおり、引き続きこれを行っています。

+0

今どこにいますか?電車の中で? = P私はあなたのスケジュールをMetaに掲載しています。私はあなたのスケジュールのためにアップホントを取得している間、多くのことを笑った! Hehehe ...ナー、私はタイムゾーンを考慮する必要があるので、あなたは家にいなければならず、テレビを見るのではなく、ただで掲示しなければならない! = Pとにかく!良い夜を! =) –

+0

@ウィル:投稿と再生PixelJunk Monstersの交互:) –

+0

どのような素晴らしい記事 - ありがとう! SafeHandleの実装により、私はそれを使う必要はほとんどありません。 – Marko

2

彼らは、ファイナライザではなく、デストラクタです。それらは管理されていないリソースのクリーンアップによく使用されます。独自のファイルクラスを作成した場合は、ファイナライザを使用してネイティブファイルハンドルをクリーンアップする必要があります。

+0

'デッサクタを「デストラクタ」と呼ぶべきかどうかという疑問がありますが、 2007年末にリリースされたC#言語仕様、バージョン3.0は、このメソッドをデストラクタと呼びます。 - Apress Illustrated C#2008.それ以来変更されていますか?また、いくつかのコード例は素晴らしいでしょう! – Marko

+0

私のコード例のコメントは無視してください。ほとんど使用されていないようです。 – Marko

0

IDisposableインターフェイスは、デストラクタ/ファイナライザとして使用する方法を提供します。

つまり、オブジェクトが使用しているリソースを解放するために、IDisposableインターフェイスを実装することができます。他の人が言ったように、Dispose()メソッドは自分で直接呼び出されるのではなく、しばらくしてオブジェクトを破棄するマネージコードによって呼び出されるため、これは古い古いデストラクタと同じではありません。

+0

私はdownvotesで大丈夫ですが、エラーがある場合、私は自分のエラーから学ぶことができるように何が間違っているか教えてください! Mark Byersは、「IDisposable」インタフェースの使用を提案している。 –

+0

いいえ、彼らは非常に異なっています。 'Dispose'は他のコードによって*明示的に呼び出されますが、デストラクタ/ファイナライザはガーベジコレクタによって非確定的に呼び出されます。 –

+0

ヘイウィル:+1!あなたは最初にそこに着いた。 – n8wrl

1

ファイナライザはC#ではほとんど必要ありません。追加すると、ファイナライザを実行するために余分なパスが必要になるため、ガベージコレクタがゴミをクリーンアップするのに時間がかかることがあります。代わりに、通常はIDisposableパターンを使用する必要があります。

ファイナライザの使用例は、リソースの漏洩が疑われる場合、デバッグ時にオブジェクトをガベージコレクションする前に正しく呼び出されたかどうかをチェックするために使用できます。管理対象外のリソースを保持するオブジェクトにDisposeが呼び出される前にファイナライザが呼び出されていると、リソースが漏洩している可能性があります。しかしファイナライザは呼び出されることはないので、アプリケーションクリティカルなロジックを含むべきではありません。

+0

私が読んでいる本のコードは、DisposeとDestructor(実際にはDispose(false)を呼び出す)の両方を実装しています。 – Marko

+0

@ Markoこのパターンは、.net 2.0でSafeHandleを導入する前に一般的でした。今は廃止されました。 – CodesInChaos

+0

お互いのおかげで、本のサンプルコードを参考にして追加しました:) – Marko

1

destructorはどういう意味ですか? C#のは、あなたが、もはやそれを必要としないときは、ハンドルを閉じるために、決定論的破壊
便利のために使用したい

  • IDisposableパターンを有しています。だから、彼らは閉じたとは、GCが非常に遅いまたは全くないかもしれないオブジェクトを収集することを決定するたびに。
    オブジェクトのグラフから自分自身を削除したり、イベントから退会するように教える純粋な管理コードでは...
    は、一般的にはほとんど役に立たないusing声明
  • ファイナライザを使用します。それを、未知の時間で、それがすべてで実行されない場合があります実行されます...私はそれを使用
    唯一のものは、それはC++デストラクタIの構文を持っていますが、私は何か
    上のDisposeを呼び出すために忘れてしまったことを私に思い出させることですそれをC++デストラクタに相当するものと見なさないでください。私はデストラクタとしてDispose()を考えるのが好きです。あなたはネイティブリソース

に使用

  • Critical finalizationSafeHandlesは私ではなく、あなたがプライベートSafeHandleを所有し、それはそれ自身のDisposeでDispose法だ呼び出す必要があり、現代コードを掲示パターンを考えます。あなたはおそらくそれらについて考えているよう

  • 0

    C#が「デストラクタ」を持っていません。 .NETのガベージコレクタでは、クラスが範囲外になったときにすぐにオブジェクトコレクションが実行されることはありません。

    私はあなたがIDisposableをパターンで、より興味を持っているものを考えます。これは、オブジェクトが使用するリソースをクリーンアップするための決定論的な方法です。

    また、.NETクラスは、オブジェクトが収集されるときに実行される「ファイナライザ」を有することができます。あなたのオブジェクトの元の呼び出し元が無視された場合は、disposeを呼び出すために使用できます。

    しかし、あなたのクラスにファイナライザを実装するGC用に特別な処理のためにそれをキューイングし、パフォーマンスへの影響があるかもしれません。