以下函数给出编译错误“不要覆盖object.Finalize。而是提供析构函数。”
protected override void Finalize()
{
this.Dispose();
base.Finalize();
}
答案 0 :(得分:18)
终结器方法称为~name()
,用您的类名替换“name”。
C#编译器将从此生成终结器。
但请注意:
SafeHandle
,而不是自己编写。e.g。
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)
以添加它们添加的任何添加字段并调用基本实现。
已编辑:添加有关何时完成的示例和说明。
答案 1 :(得分:8)
你没有。
收听编译器。你不应该覆盖Finalize。相反,您应该实现IDisposible并覆盖Dispose。
除非您明确需要释放对象直接拥有的资源,否则您应该能够在Dispose方法中执行所需的所有操作。
但如果你必须:
public class MyClass
{
public MyClass() { ... } // Constructor
public ~MyClass() { ... } // Destructor/Finalizer
}
要小心,因为终结器很棘手,如果实施不当会导致一些非常大的性能开销。
答案 2 :(得分:0)
听取编译器错误,他们的智慧超出了他们的年限(除非你真的需要,在极少数情况下,实际上弄乱了终结器......命名在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