1

私が理解しているように、この質問には 2 つの陣営があります。最初の陣営は、ファイナライザーが C# 固有のデストラクタであると考えています。したがって、彼らはこれら 2 つのことは同じであると考えています。

2 番目の陣営は、ウィキペディアに書かれているように、わずかな違いがあると考えています。「「デストラクタ」という用語は通常、決定論的に呼び出されるクリーンアップを意味するために使用されますが、「ファイナライザ」は、ガベージ コレクタが実行するように指示したときに実行されます。

しかし、私自身のために何かを明確にさせてください。決定論的に呼び出されたクリーンアップ? C# の仕様や msdn では、デストラクタは呼び出せない (自動で呼び出される) と書かれています。それらが自動的に呼び出される唯一のケースは、ガベージ コレクターによるものです。

したがって、決定論的に呼び出されるクリーンアップとガベージ コレクターの場合との間に違いは見られません。

そうですか、そうではありませんか?

4

6 に答える 6

5

大きな違いがあります。決定論的に呼び出されるとは、いつ呼び出されるかを知っていることを意味します。

C++ の場合:

{
    Person a;
    a.Name = "John";
    InvitePerson(a);
} // <-- Destructor is always invoked when the scope is left

C# の場合:

{
    Person a = new Person();
    a.Name = "John";
    InvitePerson(a);
} // <-- The finalizer is NOT invoked when the scope is left

指摘したように、主な違いは次のとおりです。C# やその他のガベージ コレクション言語では、ファイナライザーがいつ実行されるか、実行されるかどうかさえ
わかりません。 ただし、C++ では、オブジェクトがスコープ外になるとすぐにデストラクタがいつ実行されるか知っています。

于 2011-05-04T11:42:17.100 に答える
3

公式のスタンスは、C# にはデストラクタ ( ~ClassName() {}) があり、それらは にマップされるというものSystem.Object.Finalize()です。VB.NET では、ToString のように Finalize をオーバーライドするだけです。

ただし、いくつかの混乱があります。あなたはそれについて正しいです。しかし、それはファイナライズ/デストラクタと破棄に関するものです。これはEric Lippert からの投稿です(Wikipedia を参照)。

はい、これらの定義により、C# 仕様は間違っています。仕様で「デストラクタ」と呼んでいるものは実際にはファイナライザであり、「using」ステートメントによって呼び出される「Dispose()」メソッドと呼んでいるものは実際には「デストラクタ」です。

于 2011-05-04T11:42:46.280 に答える
1

C# では、ファイナライザーとデストラクタは同じものの別の名前です。

C# 言語仕様 (1.6.7.6) では、実際にはこれらをデストラクタと呼んでいます。ただし、デストラクタという名前は C++ の対応するものと簡単に間違えられる可能性があるため (C# のデストラクタとはまったく異なります)、代わりにファイナライザーという用語を使用するのが理にかなっています。

于 2011-05-04T11:40:17.457 に答える
1

セカンドオピニオンはより正しいです。オブジェクトのデストラクタが指定された時間に実行されることを保証することはできません。したがって、明示的に呼び出すことができる C++ のようなデストラクタではありませんdelete obj

.NET では、使用後に一部のリソースをクリーンアップする必要があるオブジェクトの場合、IDisposable を実装し、オブジェクトまたはusing()ブロックの使用が終了したときに Dispose を明示的に呼び出す必要があります。

于 2011-05-04T11:41:54.900 に答える
0

確定的とは、いつでもメモリを解放できることを意味します。デストラクタはファイナライザ スレッドを介して GC によって無期限に呼び出されるため、これは C# では不可能です。

于 2011-05-04T11:42:36.537 に答える
0

これは単に用語の違いによるものだと思います。単語は、異なるテキストでは異なる定義/使用法で定義されています。これは常に発生しています。

ただし、ガベージ コレクターに依存している場合、「確定的に呼び出されるクリーンアップ」はありません。あなたの結論:

したがって、決定論的に呼び出されるクリーンアップとガベージ コレクターの場合との間に違いは見られません。

...あなたが与えた文脈では意味がありません。違いは、1 つは決定論的に呼び出され、もう 1 つはそうでないことです。

于 2011-05-04T11:42:50.860 に答える