Visual C#中没有析构函数?

时间:2011-05-04 16:49:59

标签: c# destructor finalizer

据我所知,C#中的析构函数语法(~ClassName)是一种编写终结器的方法。编译成IL后,此方法成为Finalize方法。

因此,这意味着C#编程语言支持析构函数,但Visual C#作为.net框架的一部分不允许程序员使用它。

编辑:我知道可以使用IDisposable接口来清理非托管资源。问题不在于此。问题是Visual C#中是否存在析构函数? 因为析构函数的语法是一种编写终结符的方法=>没有办法定义析构函数本身。

7 个答案:

答案 0 :(得分:4)

通常需要在其他语言(例如c ++)中使用析构函数来清理内存。由于C#是垃圾收集的,因此析构函数仅用于清理无法自动清理的资源。

答案 1 :(得分:2)

我不完全同意你的陈述:

  

所以,这意味着C#编程   语言支持析构函数,但是   Visual C#作为.net框架的一部分   不允许程序员使用它。

是的,您可以在C#中编写终结器(析构函数),并且它允许您在对象被垃圾回收之前清理所需的任何非托管资源。但是,您应该小心正确地实现它(想到处理模式)。

现在,如果你的意思是支持确定性破坏吗?不一定,如果你需要确定性地释放资源,你最好的选择是IDisposable接口和使用块。

答案 2 :(得分:1)

最接近析构函数的是IDisposable接口及其Dispose()方法。使用using(){}构造,可以使Dispose()调用具有确定性,从而完成令人尊敬的RAII模式。

答案 3 :(得分:1)

  

问题是Visual C#中是否存在析构函数?因为析构函数的语法是一种编写终结符的方法=>没有办法定义析构函数本身

最接近的匹配答案可能是:不,在C#中没有确定性析构函数(例如您从C ++中了解它们)或为了可验证,安全执行而编译的任何语言CLR。

答案 4 :(得分:0)

简单的答案是你可以编写析构函数来帮助管理内存等,但你不能明确地调用它们。您可以实现IDisposable接口,并在需要时显式调用Dispose()方法。析构函数用于垃圾收集系统使用。它通常会检查您的对象是否已经被释放,然后调用相同的Dispose()方法。

基本上它就在那里,如果你忘记明确处理并且Garbage Colletor必须在你之后清理: - )

视觉位真的无关紧要。

答案 5 :(得分:0)

C#语言有一些叫做“析构函数”的东西,它的语义与C ++中的析构函数没有任何关系。虽然名称很不幸,但“析构函数”是C#语法元素的标准定义术语,它以波浪号和类名开头,并要求编译器生成Finalize()的覆盖,后者调用提供的代码,然后调用base.Finalize()。一个相当愚蠢和毫无意义的语言结构(简单地允许代码覆盖Finalize())会更容易混淆;与GC.KeepAlive()和GC.SuppressFinalize中的绑定相比,将名称Finalize()绑定到语言中将是一个小问题。 (),在使用析构函数的正确编写的程序中通常需要这两者。

顺便提一下,名称“析构函数”具有讽刺意味,因为析构函数实际上不会销毁对象,而是提供对象,否则将被销毁并使用最后一秒的缓冲来将其事务整理好

答案 6 :(得分:-1)

您可以实现IDisposable接口来创建一种析构函数(Dispose()方法)。