注意: この質問は、「デストラクタ」と「ファイナライザ」という言葉の用語の違いと、それらの正しい使用法に関するものです。C# および C++/CLI での使用例を示して、なぜこの質問をするのかを示しただけです。C# と CLR の両方でどのように実装されているかはよく知っていますが、用語の正しい使い方について質問しています。
C# の世界では、「デストラクタ」と「ファイナライザ」という用語はほぼ同じ意味で使用されているように思われます。これは、C# の仕様では「デストラクタ」という言葉を使用して非決定論的クリーンアップ機能が記述されているためだと思われますが、CLR のドキュメントでは常に「ファイナライザー」という言葉なので、C# の領域内では同じことを意味します。
ただし、C++/CLI 仕様では、この 2 つが区別されています。決定論的および非決定論的なクリーンアップの両方が可能であり、決定論的な機能には「デストラクタ」という用語を使用し、非決定論的な機能には「ファイナライザ」という用語を使用します。
ファイナライザーは、非決定的なクリーンアップを提供します。ファイナライザは、通常、デストラクタが実行されなかったオブジェクトに対して、ガベージ コレクション中に実行される「ラストチャンス」関数です。
さらに、ウィキペディアのデストラクタとファイナライザの説明は、デストラクタとファイナライザが別の概念であることを示しており、決定論に関する C++/CLI 仕様の用語の使用をサポートしています。
デストラクタとは異なり、ファイナライザは決定論的ではありません。プログラムがオブジェクトを明示的に解放すると、デストラクタが実行されます。対照的に、ファイナライザーは、内部ガベージ コレクション システムがオブジェクトを解放するときに実行されます。
質問:
コンピュータサイエンスの観点から、「デストラクタ」と「ファイナライザ」の間に明確に定義された違いはありますか、それとも用語は文脈上でのみ定義できるものですか?
明確に定義された違いがある場合、なぜ C# 仕様は「間違った」用語を使用するのでしょうか?