Finalize vs Dispose

44 浏览
0 Comments

Finalize vs Dispose

为什么有些人使用Finalize方法而不是Dispose方法?

在什么情况下您会使用Finalize方法而不是Dispose方法,反之亦然?

admin 更改状态以发布 2023年5月21日
0
0 Comments

其他人已经介绍了DisposeFinalize之间的区别(顺便提一句,Finalize方法在语言规范中仍被称为析构函数),因此我将添加一些关于Finalize方法有用的场景。

某些类型以一种易于在单个操作中使用和处理可处理资源的方式进行封装。通常的用法就像这样:打开、读取或写入、关闭(Dispose)。它非常适合using结构。

其他的则有点更困难。例如,WaitEventHandles并不像这样使用,因为它们用于在一个线程和另一个线程之间发信号。那么这些类型的Dispose应该由谁来调用呢?作为一种保护,这些类型实现了Finalize方法,当应用程序不再引用实例时,可以确保资源被处理。

0
0 Comments

当您的对象被垃圾回收并且您无法保证何时会发生这种情况(您可以强制执行它,但会影响性能)时,将调用终结器方法。

另一方面,Dispose 方法旨在由创建您的类的代码调用,以便您可以在代码使用完您的对象后立即清理和释放任何已获取的资源(未托管的数据,数据库连接,文件句柄等)。

标准做法是实现 IDisposableDispose,以便您可以在 using 语句中使用对象。例如:using(var foo = new MyObject()) { }。并且在您的终结器中,调用 Dispose,以防调用代码忘记释放您。

0