【问题标题】:There's no destructor in Visual C#?Visual C# 中没有析构函数?
【发布时间】:2011-08-18 17:17:33
【问题描述】:

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

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

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

【问题讨论】:

  • 是的,你不能在你的代码中使用析构函数。当程序显式释放对象时,将运行析构函数。相比之下,终结器在内部垃圾回收系统释放对象时执行。
  • 不,C++ 中的析构函数在 C# 中不存在。你认为你需要一个有什么理由吗?
  • 我只是想澄清一下。在文档和文章中经常使用“析构函数”和“终结器”。我看不出它们之间有什么区别,因为我看不到在 C# 中创建析构函数的任何方法。
  • stackoverflow.com/questions/1076965/… 的可能重复项有一些很好的答案。

标签: c# destructor finalizer


【解决方案1】:

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

【讨论】:

  • 问题是,Visual C# 中有析构函数吗?因为据我了解,您所描述的是终结器
  • @Sergey:如果是这个问题,也许你应该在原帖中问。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      我不太同意你的说法:

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

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

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

      【讨论】:

        【解决方案5】:

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

        基本上,如果您忘记显式处理并且垃圾收集器必须在您之后清理 :-)

        视觉位真的无关紧要。

        【讨论】:

          【解决方案6】:

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

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

          【讨论】:

            【解决方案7】:

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

            顺便说一句,“析构函数”这个名字具有讽刺意味,因为析构函数实际上并不销毁对象,而是为否则会被销毁的对象提供最后一秒的缓刑,以使它们的事务井然有序.

            【讨论】:

              猜你喜欢
              • 2018-03-09
              • 2012-04-18
              • 2011-01-21
              • 2011-03-30
              • 2017-11-18
              • 2013-02-19
              • 2012-09-17
              • 2019-10-05
              • 2017-12-14
              相关资源
              最近更新 更多