下面的函数给出编译错误“不要覆盖object.Finalize,而应该提供析构函数。”在C#中如何重载Finalize()方法?
protected override void Finalize()
{
this.Dispose();
base.Finalize();
}
下面的函数给出编译错误“不要覆盖object.Finalize,而应该提供析构函数。”在C#中如何重载Finalize()方法?
protected override void Finalize()
{
this.Dispose();
base.Finalize();
}
终结器方法被称为~name()
用您的类名替换“名称”。
C#编译器将从此生成终结器。
但请注意:
SafeHandle
,而不是写自己的。例如
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
,像这样:
using(var mc = new MyClass()) {
//use it for things
} //it gets disposed here
然后使用你的类时,其包装在使用,如: 使用(VAR MC =新MyClass的()){// 用它来做事情 } //它被安置在这里 请详细说明。 ... as i havnt us“using”... – 2010-05-26 13:33:37
@Ramakant - 当你想要像处理文件句柄一样处理一个对象时使用''using()'',例如:'using(var r = File.OpenText(“myFile.log”)){//对读者做些什么..},在该语句结束时,文件句柄尽快关闭,释放锁和资源。 – 2010-05-26 13:44:03
你错过**无效**? – 2016-03-10 03:17:57
@雷洋:是:两次。几乎6年后(!),现在已经修复。 – Richard 2016-03-10 09:01:26