代码之家  ›  专栏  ›  技术社区  ›  Jeff Leonard

在C中,析构函数和类中的finalize方法有什么区别?

  •  82
  • Jeff Leonard  · 技术社区  · 15 年前

    如果在类中有析构函数和finalize方法,有什么区别?

    我最近发现Visual Studio 2008将析构函数视为Finalize方法的同义词,这意味着Visual Studio不会让您同时在类中定义这两个方法。

    例如,以下代码片段:

    class TestFinalize
    {
        ~TestFinalize()
        {
            Finalize();
        }
    
        public bool Finalize()
        {
            return true;
        }
    }
    

    在要在析构函数中完成的调用上给出以下错误:

    以下方法或属性之间的调用不明确: 'testFinalize.~testFinalize()'和'testFinalize.Finalize()'

    如果finalize调用被注释掉,则会出现以下错误:

    类型“ManagementConcepts.Service.TestFinalize”已定义名为 使用相同参数类型的“Finalize”

    3 回复  |  直到 7 年前
        1
  •  57
  •   Lloyd    7 年前

    C中的析构函数重写 System.Object.Finalize 方法。你 不得不 使用析构函数语法。手动覆盖 Finalize 将向您发送错误消息。

    基本上你想用你的 定稿 方法声明为 hiding 基类的方法。它将导致编译器发出警告,可以使用 new 修饰符(如果可以的话)。这里需要注意的是你 不能 二者都 override 并宣布 新的 同时具有相同名称的成员,因此同时具有析构函数和 定稿 方法将导致错误(但是 可以 ,尽管不推荐,但声明 public new void Finalize() 方法(如果不声明析构函数)。

        2
  •  61
  •   Pacerier    8 年前

    维基百科对定稿器和 destructor finalizer 文章。

    C真的没有“真”的析构函数。语法类似于C++析构函数,但它确实是一个终结器。您在示例的第一部分中正确地编写了它:

    ~ClassName() { }
    

    上面是一个 Finalize 功能。它确保基中的终结器可以运行,但在其他方面与重写 定稿 功能。这意味着,在编写析构函数语法时,实际上是在编写终结器。

    According to Microsoft ,终结器引用垃圾收集器在收集时调用的函数。( 定稿 ,而析构函数是作为结果执行的代码位(即 定稿 )他们是如此接近于同一件事,以至于微软不应该做出区分。

    微软对C++的“析构函数”术语的使用是误导性的,因为在C++中,当对象被删除或弹出堆栈时,它就在同一线程上执行,而在C语言中,它在另一时间在单独的线程上执行。

        3
  •  18
  •   Community CDub    8 年前

    Found here: http://sanjaysainitech.blogspot.com/2007/06/difference-between-destructor-dispose.html

    1. 析构函数

      它们是包含对象清理代码的特殊方法。 不能在代码中显式调用它们 由GC隐式地。在C中,它们与前面的类名同名 由 ~ 符号。像-

      Class MyClass
      {
      
      ~MyClass()
      {
      .....
      }
      }
      

      在vb.net中,析构函数是通过重写finalize实现的。 System.Object类的方法。

    2. 处置

      这些方法与类中的任何其他方法一样,可以调用 但它们有一个清理物体的特殊目的。 在Dispose方法中,我们为对象编写清理代码。它是 重要的是我们释放了处理中所有未管理的资源 方法,如数据库连接、文件等。类实现 Dispose方法应实现IDisposable接口。Dispose方法 应为其所在的对象调用gc.SuppressFinalize方法 如果类具有destroctor,因为它已经完成了 清理对象,这样垃圾就不需要了 收集器调用对象的Finalize方法。参考文献: http://msdn2.microsoft.com/en-us/library/aa720161(VS.71).aspx

    3. 定稿

      Finalize方法作为清除 未调用Dispose方法的事件。你应该只 实现Finalize方法以清除非托管资源。你 不应为托管对象实现Finalize方法,因为 垃圾收集器自动清理托管资源。 finalize方法由gc隐式调用,因此不能 从你的代码中调用它。

      注: 在C中,Finalize方法不能被重写,因此必须 使用其内部实现将重写 Finalize方法位于msil中,但在vb.net中,Finalize方法可以是 重写,因为它确实支持析构函数方法。

    更新: Interesting semi-related thread here .

    推荐文章