我正在查看一些代码,其中有这个语句:
~ConnectionManager()
{
Dispose(false);
}
该类实现了IDisposable
接口,但我不知道波浪线(~)与此有何关系。
~是析构函数
Finalize
在C#中,Finalize方法执行标准C++析构函数的操作。在C#中,您不需要使用名称Finalize - 您可以使用C++析构函数语法,在类名前放置波浪号(~)符号。
Dispose
最好在Close()或Dispose()方法中处置对象,以便类的用户可以显式地调用它们。GC会调用Finalize(析构函数)。
IDisposable接口告诉世界,您的类持有需要释放的资源,并为用户提供释放它们的方法。如果确实需要在类中实现终结器,您的Dispose方法应使用GC.SuppressFinalize()方法来确保抑制实例的终结。
使用哪种方式?
不能显式调用析构函数。垃圾回收器将调用您的析构函数。如果您要处理珍贵的不受管理的资源(例如文件句柄),并希望尽快关闭和处置它们,您应该实现IDisposable接口。
这是一个终结器。说实话,你很少需要编写终结器。只有在以下情况下才需要编写终结器:
IntPtr
),并且您无法使用使其更容易的SafeHandle
IDisposable
。(我的偏好是密封类,除非它们专门设计用于继承。)在这种情况下,终结器是规范Dispose模式的一部分。它用于指示类的析构函数。
try/finally
块,以确保调用父级Finalize
方法。大多数关于析构函数的事情也适用于终结器,反之亦然,但这些术语的含义略有不同。 - supercat~通常表示解构函数,它在对象销毁之前运行。
Finalize
方法会递归调用”。请注意,这与可继承析构函数的行为不同。 - Mark Amery