函数名前面的波浪号在C#中是什么意思

本文关键字:是什么 意思 前面 函数 | 更新日期: 2023-09-27 17:48:52

我正在看一些代码,它有这样的语句:

~ConnectionManager()
{
    Dispose(false);
}

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

函数名前面的波浪号在C#中是什么意思

~是析构函数

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

完成

在C#中,Finalize方法执行标准C++析构函数所要执行的操作。在C#中不将其命名为Finalize,而是使用C++析构主义语法,即在类名之前放置波浪号(~)符号。

处置

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

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

使用什么

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

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

  • 您可以直接访问非托管资源(例如通过IntPtr),但不能使用SafeHandle,这使访问变得更容易
  • 您正在一个未密封的类中实现IDisposable。(我倾向于密封类,除非它们是为继承而设计的。)在这种情况下,终结器是规范Dispose模式的一部分

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

与C++相同,它是析构函数;然而,在C#中,您没有显式调用它,而是在垃圾收集器收集对象时调用它。

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

~通常表示解构器。这是在物体死亡之前运行的。

以下是我发现的

的C#解构器的描述