0

私が理解しているように、C#のデストラクタ構文(〜ClassName)は、ファイナライザーを作成する方法です。このメソッドは、ILにコンパイルした後、Finalizeメソッドになります。

つまり、C#プログラミング言語はデストラクタをサポートしますが、.netフレームワークの一部としてのVisual C#では、プログラマーはそれを使用できません。

編集:管理されていないリソースをクリーンアップするためにIDisposableインターフェイスを使用できることを知っています。問題はそれについてではありません。問題は、Visual C#にデストラクタが存在するかどうかについてです。デストラクタの構文はファイナライザを作成する方法であるため=>デストラクタ自体を定義する方法はありません。

4

7 に答える 7

4

他の言語(c ++など)では、通常、メモリをクリーンアップするためにデストラクタが必要です。C#はガベージコレクションされるため、デストラクタは、他の方法では自動的にクリーンアップされないリソースをクリーンアップする場合にのみ役立ちます。

于 2011-05-04T16:51:57.343 に答える
2

私はあなたの声明に完全には同意しません:

つまり、C#プログラミング言語はデストラクタをサポートしますが、.netフレームワークの一部としてのVisual C#では、プログラマーはそれを使用できません。

はい、C#でファイナライザー(デストラクタ)を作成できます。これにより、オブジェクトがガベージコレクションされる前に、必要な管理されていないリソースをクリーンアップできます。ただし、正しく実装するように注意する必要があります(disposeパターンが思い浮かびます)。

さて、あなたが意味するなら、それは決定論的破壊をサポートしますか?必ずしも、リソースを決定論的に解放する必要がある場合、最善の策はIDisposableインターフェースとusingブロックです。

于 2011-05-04T16:55:20.730 に答える
1

デストラクタに最も近いのは、IDisposableインターフェイスとそのDispose()メソッドです。コンストラクトを使用using(){}すると、Dispose()呼び出しを決定論的にして、由緒あるRAIIパターンを完成させることができます。

于 2011-05-04T16:54:28.813 に答える
1

問題は、Visual C#にデストラクタが存在するかどうかについてです。デストラクタの構文はファイナライザを作成する方法であるため=>デストラクタ自体を定義する方法はありません

最も近い答えはおそらく次のとおりです。いいえ、C#またはCLRによる検証可能で安全な実行のためにコンパイルされた言語には、決定論的なデストラクタはありません(たとえば、C ++からそれらを知っています)。

于 2011-05-04T17:38:38.243 に答える
0

簡単な答えは、メモリ管理などを支援するデストラクタを作成することはできますが、明示的に呼び出すことはできないということです。IDisposableインターフェイスを実装し、必要に応じてDispose()メソッドを明示的に呼び出します。デストラクタは、ガベージコレクションシステムが使用するために存在します。通常、オブジェクトがすでに破棄されているかどうかを確認してから、同じDispose()メソッドを呼び出します。

基本的に、明示的に処分するのを忘れて、ガベージコレーターがあなたの後に片付けなければならない場合にそこにあります:-)

視覚的なビットは本当に無関係です。

于 2011-05-04T17:05:45.150 に答える
0

C#言語には「デストラクタ」と呼ばれるものがあり、そのセマンティクスはC++のデストラクタとはまったく関係がありません。名前は残念ですが、「デストラクタ」は、チルダとクラス名で始まるC#構文要素の標準定義の用語であり、コンパイラに、指定されたコードを呼び出してから、Finalize()のオーバーライドを生成するように要求します。 base.Finalize()を呼び出します。かなりばかげた無意味な言語構造(コードがFinalize()をオーバーライドできるようにするだけで、混乱が少なくなります。名前Finalize()を言語にバインドすることは、GC.KeepAlive()およびGC.SuppressFinalizeでのバインドと比較して小さな問題になります。 ()、どちらも通常、デストラクタを使用する適切に記述されたプログラムで必要になります)。

ちなみに、「デストラクタ」という名前は皮肉なことです。デストラクタは実際にはオブジェクトを破壊するのではなく、問題を整理するために最後の1秒の猶予で破壊されるオブジェクトを提供するからです。

于 2011-12-21T19:34:25.077 に答える
-1

IDisposableインターフェイスを実装して、一種のデストラクタ(Dispose()メソッド)を作成できます。

于 2011-05-04T16:53:13.757 に答える