据我了解,C# 中的析构函数语法(~ClassName)是一种编写终结器的方法。该方法编译到 IL 后成为 Finalize 方法。
因此,这意味着 C# 编程语言确实支持析构函数,但作为 .net 框架的一部分的 Visual C# 不允许程序员使用它。
编辑:我知道可以使用 IDisposable 接口来清理非托管资源。问题不在于它。问题是关于 Visual C# 中是否有析构函数?因为析构函数的语法是编写终结器的一种方式 => 没有办法定义析构函数本身。
据我了解,C# 中的析构函数语法(~ClassName)是一种编写终结器的方法。该方法编译到 IL 后成为 Finalize 方法。
因此,这意味着 C# 编程语言确实支持析构函数,但作为 .net 框架的一部分的 Visual C# 不允许程序员使用它。
编辑:我知道可以使用 IDisposable 接口来清理非托管资源。问题不在于它。问题是关于 Visual C# 中是否有析构函数?因为析构函数的语法是编写终结器的一种方式 => 没有办法定义析构函数本身。
在其他语言(如 c++)中,通常需要析构函数来清理内存。由于 C# 是垃圾收集器,因此析构函数仅用于清理不会自动清理的资源。
我不太同意你的说法:
因此,这意味着 C# 编程语言确实支持析构函数,但作为 .net 框架的一部分的 Visual C# 不允许程序员使用它。
是的,您可以在 C# 中编写终结器(析构函数),它确实允许您在对象被垃圾收集之前清理您需要的任何非托管资源。但是,您应该小心正确地实现它(想到 dispose 模式)。
现在,如果您的意思是它是否支持确定性破坏?不一定,如果您需要确定性地释放资源,最好的选择是 IDisposable 接口和 using 块。
最接近析构函数的是IDisposable
接口及其Dispose()
方法。使用该using(){}
构造,您可以使 Dispose() 调用具有确定性,从而完成古老的 RAII 模式。
问题是关于 Visual C# 中是否有析构函数?因为析构函数的语法是编写终结器的一种方式 => 没有办法定义析构函数本身
最接近的答案可能是:不,在 C# 或为 CLR 可验证、安全执行而编译的任何语言中没有确定性析构函数(例如,您从 C++ 中知道它们)。
简单的答案是您可以编写析构函数来帮助进行内存管理等,但您不能显式调用它们。如果需要,您可以实现 IDisposable 接口并显式调用 Dispose() 方法。析构函数是供垃圾收集系统使用的。它通常会检查您的对象是否已被释放,然后调用相同的 Dispose() 方法。
基本上,如果您忘记显式处理并且垃圾收集器必须在您之后清理:-)
视觉位真的无关紧要。
C# 语言有称为“析构函数”的东西,其语义与 C++ 中的析构函数没有任何关系。虽然名字很不幸,但“析构函数”是 C# 语法元素的标准定义术语,它以波浪号和类名开头,它要求编译器生成对 Finalize() 的覆盖,它调用提供的代码,然后调用 base.Finalize()。一个相当愚蠢和毫无意义的语言结构(简单地允许代码覆盖 Finalize() 将不会那么混乱;与 GC.KeepAlive() 和 GC.SuppressFinalize 中的绑定相比,将名称 Finalize() 绑定到语言中将是一个小问题(),在使用析构函数的正确编写的程序中通常需要这两者)。
顺便说一句,“析构函数”这个名字具有讽刺意味,因为析构函数实际上并不销毁对象,而是提供原本会在最后一秒暂缓销毁的对象以使它们的事务井井有条。
您可以实现 IDisposable 接口来创建一种析构函数(Dispose() 方法)。