请注意:这个问题是关于“析构函数”和“终结器”这两个词之间的术语差异及其正确用法。我只是提供了它们在 C# 和 C++/CLI 中的使用示例,以说明我问这个问题的原因。我很清楚它是如何在 C# 和 CLR 中实现的,但我问的是术语的正确使用。
在 C# 世界中,术语“析构函数”和“终结器”似乎可以互换使用,我怀疑这是因为 C# 规范使用“析构函数”一词描述了非确定性清理功能,而 CLR 文档总是使用“终结器”一词,因此在 C# 领域内,它们的含义相同。
但是,在 C++/CLI 规范中,两者之间存在区别。它允许确定性和非确定性清理,并使用术语“析构函数”表示确定性功能,使用“终结器”表示非确定性功能:
终结器提供非确定性清理。终结器是在垃圾回收期间执行的“最后机会”函数,通常在未执行析构函数的对象上执行。
此外,维基百科对析构函数和终结器的描述表明析构函数和终结器是独立的概念,并支持 C++/CLI 规范对确定性术语的使用:
与析构函数不同,终结器不是确定性的。当程序显式释放对象时,将运行析构函数。相比之下,终结器在内部垃圾回收系统释放对象时执行。
问题:
从计算机科学的角度来看,“析构函数”和“终结函数”之间是否存在明确定义的区别,或者术语只能根据上下文来定义?
如果存在明确定义的差异,那么为什么 C# 规范会使用“错误”的术语?