C#にデストラクタはありますか?

そのため、そもそもマネージドリソースとアンマネージドリソースの2種類があります。 最初のものについては、まったく心配する必要はありません-ガベージコレクターがそれらを処理します。 しかし、管理されていないリソースでは、事態ははるかに複雑です。 私たちのゴミ屋はそれらを解放する方法を知らないので、私たちはこの問題に対処しなければなりません。



デストラクタとファイナライザの違いは何ですか



デストラクタは、オブジェクトを初期化解除するためのメソッドです。 決定論的破壊のようなものに言及することが重要です。 つまり、オブジェクトがいつ削除されるかを正確に把握しています。 ほとんどの場合、これはオブジェクトのスコープが終了するか、プログラマが明示的にメモリを解放したときに発生します(c / s ++で)。



そして、これがウィキペディアのファイナライザーの定義です。



ファイナライザーは、このクラスのオブジェクトがガベージコレクターによって未使用として認識された瞬間とオブジェクトが削除された瞬間(占有されているメモリを解放する)の間に、ランタイムによって自動的に呼び出されるクラスメソッドです。 これは反対です-非決定論的破壊。

つまり、ファイナライザの主なマイナス点は、いつ呼び出されるかわからないということです。 これにより、大量の問題が発生する可能性があります。



しかし、.NETのデストラクタとファイナライザは、通常のデストラクタとファイナライザと同じではありません。



Visual C#には、C ++でデストラクタを作成する構文を使用して作成され、デストラクタと呼ばれるファイナライザもありますが、そうではありません。 これは、オーバーライドできないFinalizeメソッドを介して実行されます(C#では不可能ですが、VBでは可能です)。そのため、チルダ(〜ClassName)を介してデストラクタ構文を使用する必要があります。 そして、ILにコンパイルするときのみ、コンパイラはそれをFinalizeと呼びます。 このメソッドを実行すると、親クラスのファイナライザーも呼び出されます。



一般に、この問題は非常に論争の的となっています。 .NETのデストラクタとファイナライザはまったく同じことを意味し、名前のみが異なると考える人もいれば、大きな違いがあると考える人もいます。それらを混同することは犯罪です。



C#プログラミング言語(現時点では4.0)の仕様を見ると、「ファイナライザー」という単語は決して表示されません。 まあ、これはまだ説明することができます。 ファイナライザーは、ガベージコレクターと密接に関連しています。ガベージコレクターは、ランタイム(この場合はCLR)の一部ですが、プログラミング言語自体ではありません。



さらに進んで、CLI仕様(ECMA-335)に進みましょう。 これが書かれているものです。



オブジェクト型を作成するクラス定義は、呼び出されるインスタンスメソッド(ファイナライザと呼ばれる)を提供できます。

クラスのインスタンスに到達できなくなったとき。



これは間違いなくファイナライザの説明ですが、私の意見では少し不正確です。



次に、msdnに移動します。 ファイナライザという単語が最も純粋な形で現れる記事はありませんが、デストラクタという単語はほとんど常に使用されます。 論理的な疑問が生じます-なぜ人々はデストラクタと呼ばないのですか? マイクロソフトの開発者がこの言葉の意味を意図的に変更したことがわかりました。 そして、ここに理由があります。



Visual C#では、非決定論的な破壊を知っています。 これは、オブジェクトのスコープが終了し、ガベージコレクターが占有しているメモリを解放できることに気づいたとしても、これがすぐに発生するという事実ではないことを意味します。 つまり、これは純粋なファイナライザです。 すべての言語でデストラクタに使用される構文を使用しているため、Visual C#ではデストラクタを定義する方法は(一般的に)ないと想定できます。 これは、単に存在しないことを意味します。 はい、特別な必要もありませんが、Visual C#にもデストラクタが存在しないことに同意する必要があります。



結論は、私はばかで完全に誤解されている(そしてこの可能性が非常に高い)か、デストラクタをそのように見えるもの(チルダ、こんにちは)と呼ぶ必要がありますが、実際はファイナライザです。 どういうわけかこの世界に住んでいる必要があります。



All Articles