180

我正在查看一些代码,它有这样的声明:

~ConnectionManager()
{
    Dispose(false);
}

该类实现了IDisposable接口,但我不知道这是否是波浪号(~)用于的一部分。

4

6 回答 6

228

~ 是析构函数

  1. 析构函数是自动调用的,不能显式调用。
  2. 析构函数不能重载。因此,一个类最多可以有一个析构函数。
  3. 析构函数不是继承的。因此,一个类除了可以在其中声明的析构函数之外没有其他析构函数。
  4. 析构函数不能与结构一起使用。它们仅与类一起使用。当任何代码不再可能使用该实例时,该实例就有资格被销毁。
  5. 实例的析构函数可以在实例符合销毁条件后的任何时间执行。
  6. 当一个实例被析构时,它的继承链中的析构函数被调用,顺序是从派生最多到派生最少。

敲定

在 C# 中,Finalize 方法执行标准 C++ 析构函数会执行的操作。在 C# 中,您不将其命名为 Finalize - 您使用 C++ 析构函数语法,即在类名称之前放置一个波浪号 (~) 符号。

处置

最好在类的用户可以显式调用的Close()或方法中处理对象。Dispose()Finalize(析构函数)由 GC 调用。

IDisposable接口告诉世界您的类持有需要释放的资源,并为用户提供释放它们的方法。如果确实需要在类中实现终结器,则 Dispose 方法使用该GC.SuppressFinalize()方法来确保抑制实例的终结。

用什么?

显式调用析构函数是不合法的。垃圾收集器将调用您的析构函数。如果您确实要处理想要尽快关闭和处置的宝贵非托管资源(例如文件句柄),则应该实现 IDisposable 接口。

于 2008-10-09T19:05:46.577 回答
46

这是一个终结器。老实说,您应该很少需要编写终结器。你真的只需要写一个,如果:

  • 您可以直接访问非托管资源(例如通过IntPtr)并且您不能使用SafeHandle这使得它更容易
  • 您正在IDisposable一个未密封的类中实现。(我的偏好是密封类,除非它们是为继承而设计的。)在这种情况下,终结器是规范 Dispose 模式的一部分。
于 2008-10-09T19:04:29.527 回答
9

它用于指示类的析构函数。

于 2008-10-09T19:02:12.013 回答
5

和C++一样,都是析构函数;但是在 C# 中,您不会显式调用它,而是在垃圾收集器收集对象时调用它。

于 2008-10-09T19:02:35.460 回答
3

请参阅析构函数(C# 编程指南)。但是请注意,与 C++ 不同,程序员无法控制何时调用析构函数,因为这是由垃圾收集器决定的。

于 2008-10-09T19:10:15.413 回答
1

~ 通常代表一个解构器。它在对象死亡之前运行。

这是我发现的 C# 解构器的描述

于 2008-10-09T19:02:44.803 回答