C# では、クラス内のデストラクターと Finalize メソッドの違いは何ですか?

StackOverflow https://stackoverflow.com/questions/1076965

  •  21-08-2019
  •  | 
  •  

質問

クラス内のデストラクターと Finalize メソッドに違いがある場合、違いは何ですか?

最近、Visual Studio 2008 ではデストラクターが Finalize メソッドと同義であるとみなされることを発見しました。これは、Visual Studio ではクラス内で両方のメソッドを同時に定義できないことを意味します。

たとえば、次のコード部分は次のとおりです。

class TestFinalize
{
    ~TestFinalize()
    {
        Finalize();
    }

    public bool Finalize()
    {
        return true;
    }
}

デストラクターでの Finalize の呼び出しで次のエラーが発生します。

次のメソッドまたはプロパティ間の呼び出しがあいまいです。「TestFinalize.~TestFinalize()」および「TestFinalize.Finalize()」

また、Finalize の呼び出しがコメントアウトされている場合は、次のエラーが発生します。

タイプ 'ManagementConcepts.service.TestFinalize'は、同じパラメータータイプで「Finilize」と呼ばれるメンバーを既に定義しています

役に立ちましたか?

解決

C#でのデストラクタはSystem.Object.Finalizeメソッドをオーバーライド。あなたは に使用デストラクタ構文そうする必要があります。手動オーバーライドFinalizeはあなたにエラーメッセージが表示されます。

<のhref =「http://msdn.microsoft.com/en-us/library/aa691135(VS.71).aspx」のrel = "noreferrerは、基本的にどのようなあなたのFinalizeメソッドの宣言でやろうとしているあります「>の基底クラスのメソッドする> new修飾子を使用して沈黙することができ、警告を発するようになります。ここで注意すべき重要なことは、(あなたが両方overrideをすることができますのないので、デストラクタとエラーになりますnew方法の両方を有すると同時に、同じ名前を持つFinalizeメンバを宣言することであるあなたが、 に、推奨されていないが、あなたは)デストラクタを宣言していない場合public new void Finalize()メソッドを宣言することができます。

他のヒント

ウィキペディアはファイナライザとデストラクタの違いについていくつかの良い議論を持っていますファイナライザの記事でます。

C#が本当に「真」デストラクタを持っていません。構文はC ++デストラクタに似ているが、それは本当に、ファイナライザです。あなたはあなたの例の最初の部分でそれを正しく書いてます:

~ClassName() { }

上記Finalize機能のための糖衣構文です。これは、ベースにおけるファイナライザが実行されることが保証されることが保証されますが、Finalize関数をオーバーライドする他の点では同じです。これはデストラクタ構文を書くとき、あなたは本当にファイナライザを書いていることを意味します。

マイクロソフトのによると、ファイナライザは、関数を参照しますデストラクタは結果(Finalizeなっシンタックスシュガー)として実行されるコードのあなたのビットである一方で、それは、(Finalize)を収集するときガベージコレクタが呼び出されます。彼らは、Microsoftが区別を作ったことがないはずです同じものであることにとても近いです。

C ++ではそれは、すぐにオブジェクトが削除されるのと同じスレッド上で実行したり、スタックからポップされているため、C#で、それは別の独立したスレッドで実行されている間、

C ++の 『デストラクタ』という用語のMicrosoftの使用は、誤解を招きます時間ます。

ここにあります:http://sanjaysainitech.blogspot.com/2007/06/difference-between-destructor-dispose.html

  1. デストラクター

    これらは、オブジェクトのクリーンアップ コードを含む特別なメソッドです。コードはGCによって暗黙的に呼ばれるため、それらを明示的に呼び出すことはできません。C#では、クラス名と同じ名前があります ~ サイン。のように-

    Class MyClass
    {
    
    ~MyClass()
    {
    .....
    }
    }
    

    VB.NETでは、System.Objectクラスのファイナライズメソッドをオーバーライドすることにより、デストラクタが実装されます。

  2. 廃棄

    これらはクラス内の他の方法とまったく同じように、明示的に呼び出すことができますが、オブジェクトをクリーンアップするという特別な目的があります。destroy メソッドでは、オブジェクトのクリーンアップ コードを記述します。データベース接続、ファイルなどのように、廃棄方法のすべての管理されていないリコールを解放することが重要です。クラス実装の処分方法は、IDISPOSABLEインターフェイスを実装する必要があります。処分方法は、オブジェクトをクリーンアップするための作業をすでに行っているため、クラスが既にdesturctorを持っているかどうかを処分するオブジェクトのgc.suppressfinalizeメソッドを呼び出す必要があります。オブジェクトのファイナライズメソッドを呼び出すためのゴミコレクター。参照: http://msdn2.microsoft.com/en-us/library/aa720161(VS.71).aspx

  3. ファイナライズ

    廃棄方法が呼び出されない場合に、ファイナライズメソッドはリソースをクリーンアップするための保護手段として機能します。マネージドされていないリソースをクリーンアップするためのファイナライズ方法のみを実装する必要があります。Garbage Collectorが管理されたリソースを自動的にクリーンアップするため、管理されたオブジェクトのファイナライズ方法を実装しないでください。ファイナライズメソッドは、GCによって暗黙的に呼び出されるため、コードから呼び出すことはできません。

    注記: C#では、ファイナライズメソッドがオーバーライドできないため、内部実装がMSILのファイナライズメソッドをオーバーライドするデストラクタを使用する必要があります。

アップデート: 興味深い準関連スレッドはこちら.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top