那里';在Visual C#中没有析构函数?

那里';在Visual C#中没有析构函数?,c#,destructor,finalizer,C#,Destructor,Finalizer,据我所知,C#中的析构函数语法(~ClassName)是编写终结器的一种方法。此方法在编译到IL后成为Finalize方法 因此,这意味着C#编程语言确实支持析构函数,但作为.net framework的一部分,Visual C#不允许程序员使用它 编辑:我知道可以使用IDisposable接口来清理非托管资源。问题不在于它。问题是Visual C中是否存在析构函数? 因为析构函数的语法是编写终结器=>的一种方法,所以无法定义析构函数本身。析构函数在其他语言(如c++)中通常是清理内存所必需的。

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

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

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

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

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

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

我不太同意您的说法:

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

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


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

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

基本上,如果您忘记显式地处理垃圾,垃圾收集器必须在您之后进行清理,它就会出现:-)

视觉部分实际上是无关紧要的

问题是Visual C中是否存在析构函数?因为析构函数的语法是一种编写终结器=>的方法,所以无法定义析构函数本身

最接近的匹配答案可能是:不,在C语言中没有<强> >确定< <强>析构函数(如C++中所知道的)或编译为CLR的可验证的、安全的执行的任何语言。其语义与C++中的析构函数无关。虽然名称很不幸,“析构函数”是C#语法元素的标准定义术语,它以波浪号和类名开头,并请求编译器生成Finalize()的重写,该重写调用提供的代码,然后调用base.Finalize()。一个相当愚蠢且毫无意义的语言构造(简单地允许代码重写Finalize(),就不会那么混乱;与GC.KeepAlive()和GC.SuppressFinalize()中的绑定相比,将名称Finalize()绑定到语言中是一个小问题,这两者通常都需要在使用析构函数的正确编写的程序中使用)


顺便说一句,“析构函数”这个名字很讽刺,因为析构函数实际上并不销毁对象,而是提供那些本来会在最后一秒被销毁的对象,以使它们的事情井然有序。

问题是,Visual C#中是否有析构函数?因为据我所知,你所描述的是finalizer@Sergey:如果这是一个问题,也许你应该在原始帖子中问它。是的,你不能在代码中使用析构函数。当程序显式释放对象时,将运行析构函数。相反,当内部垃圾回收系统释放对象时执行终结器。不,C++中的C++中不存在析构函数。你有什么理由认为你需要一个吗?我只是想澄清一下。在文档和文章中,经常使用“析构函数”和“终结器”。我看不出它们之间有什么区别,因为我看不到任何在C#中创建析构函数的方法。可能会重复一些好的答案。