在C#中如何覆盖Finalize()方法?

Ram*_*lia 6 c#

以下函数给出编译错误"不要覆盖object.Finalize.而是提供析构函数."

protected override void Finalize()
{           
    this.Dispose();
    base.Finalize();
}
Run Code Online (Sandbox Code Playgroud)

Ric*_*ard 19

finalizer方法称为~name()用您的类名替换"name".

C#编译器将从中生成终结器.

但请注意:

  1. 如果确实需要,只使用终结器:您的类型直接包含本机资源(组成包装器的类型只使用Dispose模式).
  2. 考虑专业SafeHandle而不是自己写.
  3. 实现dispose模式以允许调用者快速释放资源.
  4. 确保您的Dispose和Finalizer都是幂等的 - 可以多次安全地调用它们.

例如

class MyClass : IDisposable {
  private IntPtr SomeNativeResource;

  ~MyClass() {
    Dispose(false);
  }

  public void Dispose() {
    Dispose(true);
  }

  protected virtual void Dispose(bool disposing) {
    if (disposing) {
      // Dispose any disposable fields here
      GC.SuppressFinalize(this);
    }
    ReleaseNativeResource();
  }
}
Run Code Online (Sandbox Code Playgroud)

子类可以覆盖Dispose(bool)以添加它们添加的任何添加字段并调用基础实现.

编辑:添加有关何时完成的示例和说明.


Jus*_*ner 8

你没有.

听取编译器.你不应该覆盖Finalize.相反,您应该实现IDisposible并覆盖Dispose.

除非您明确需要释放对象直接拥有的资源,否则您应该能够在Dispose方法中执行所需的所有操作.

但如果你必须:

public class MyClass
{
    public MyClass() { ... } // Constructor
    public ~MyClass() { ... } // Destructor/Finalizer
}
Run Code Online (Sandbox Code Playgroud)

要小心,因为终结器很棘手,如果实施不当可能带来一些相当大的性能开销.