【发布时间】:2010-09-16 08:45:17
【问题描述】:
我正在查看一些代码,它有这样的声明:
~ConnectionManager()
{
Dispose(false);
}
该类实现了IDisposable 接口,但我不知道这是否是波浪号(~)用于的一部分。
【问题讨论】:
我正在查看一些代码,它有这样的声明:
~ConnectionManager()
{
Dispose(false);
}
该类实现了IDisposable 接口,但我不知道这是否是波浪号(~)用于的一部分。
【问题讨论】:
~ 是析构函数
敲定
在 C# 中,Finalize 方法执行标准 C++ 析构函数会执行的操作。在 C# 中,您不将其命名为 Finalize - 您使用 C++ 析构函数语法,即在类名之前放置一个波浪号 (~) 符号。
丢弃
最好在类用户可以显式调用的Close() 或Dispose() 方法中处理对象。 Finalize(析构函数)由 GC 调用。
IDisposable 接口告诉全世界你的类持有需要释放的资源,并为用户提供释放它们的方法。如果您确实需要在类中实现终结器,您的 Dispose 方法应该使用GC.SuppressFinalize() 方法来确保抑制实例的终结。
使用什么?
显式调用析构函数是不合法的。垃圾收集器将调用您的析构函数。如果您确实要处理想要尽快关闭和处置的宝贵非托管资源(例如文件句柄),则应该实现 IDisposable 接口。
【讨论】:
Finalize 方法被递归调用继承链中的所有实例,从派生最多的实例到派生最少的实例” .请注意,这与您从可继承的析构函数获得的行为不同。
这是finalizer。老实说,您应该很少需要编写终结器。你真的只需要写一个,如果:
IntPtr),但您不能使用SafeHandle,这样会更容易IDisposable。 (我的偏好是密封类,除非它们是为继承而设计的。)在这种情况下,终结器是规范 Dispose 模式的一部分。【讨论】:
用于表示类的析构函数。
【讨论】:
try/finally 块,以确保调用父 Finalize 方法。大多数适用于析构函数的事情都适用于终结器,反之亦然,但这些词的含义略有不同。
和C++一样,都是析构函数;但是在 C# 中,您不会显式调用它,而是在垃圾收集器收集对象时调用它。
【讨论】:
见Destructors (C# Programming Guide)。但是请注意,与 C++ 不同,程序员无法控制何时调用析构函数,因为这是由垃圾收集器决定的。
【讨论】:
~ 通常代表一个解构器。它在对象死亡之前运行。
【讨论】: