Csharp/C#教程:在C#中如何覆盖Finalize()方法?分享


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

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

protected override void Finalize() { this.Dispose(); base.Finalize(); } 

终结器方法称为~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(); } } 

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

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

你没有。

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

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

但如果你必须:

 public class MyClass { public MyClass() { ... } // Constructor public ~MyClass() { ... } // Destructor/Finalizer } 

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

听听编译器错误,他们的智慧超出了他们的年限(除非你真的需要,在极少数情况下,实际上是搞乱终结器……命名在C#中有点倒退)。

您应该实现Dispose() ,使您的类实现IDisposable ,如下所示:

 public class MyClass : IDisposable { public void Dispose() { //cleanup } } 

然后在使用你的类时,将它包装在一个using ,如下所示:

上述就是C#学习教程:在C#中如何覆盖Finalize()方法?分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!

 using(var mc = new MyClass()) { //use it for things } //it gets disposed here 

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/cdevelopment/1009789.html

(0)
上一篇 2021年12月29日
下一篇 2021年12月29日

精彩推荐