在C#中,函数名前的波浪线是什么意思?

在C#中,函数名前的波浪线是什么意思?,c#,syntax,tilde,C#,Syntax,Tilde,我在看一些代码,它有这样一句话: ~ConnectionManager() { Dispose(false); } < P>类实现了 IDISPOLIDYE/接口,但不知道是否是TILDE(~)使用的一部分。 < P>用于指示类的析构函数。 < P>与C++相同,它是析构函数;但是在C#中,您不会显式调用它,它是在垃圾收集器收集对象时调用的。~通常表示解构器。在对象死亡之前运行 这是一个很好的例子。老实说,您应该很少需要编写终结器。只有在以下情况下,您才需要编写一个: 您可以直接访问

我在看一些代码,它有这样一句话:

~ConnectionManager()
{
    Dispose(false);
}

< P>类实现了 IDISPOLIDYE/接口,但不知道是否是TILDE(~)使用的一部分。

< P>用于指示类的析构函数。

< P>与C++相同,它是析构函数;但是在C#中,您不会显式调用它,它是在垃圾收集器收集对象时调用的。

~通常表示解构器。在对象死亡之前运行

这是一个很好的例子。老实说,您应该很少需要编写终结器。只有在以下情况下,您才需要编写一个:

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

~是析构函数

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

    <>在C++中,Fiel化方法执行标准C++析构函数所要执行的操作。在C++中,你不把它命名为Field-你使用C++析构函数语法,它把一个TrdE(~)符号放在类的名称之前。p> 处置

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

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

    使用什么?


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

    请参阅。但是,与C++不同,程序员不能控制析构函数何时被调用,因为这是垃圾回收器所决定的。< / P>它们都是正确的,这取决于你读到的C规范。最新的MS one(unified C#3.0)将它们称为析构函数(如第10.13节),但ECMA规范将它们称为终结器。@1800INFORMATION:语法元素正确地称为析构函数。如果类有析构函数,C#编译器将自动生成一个终结器,其中包含一个通常无用的
    try/finally
    块,以确保调用父
    Finalize
    方法。大多数对于析构函数是正确的,对于终结器也是正确的,反之亦然,但是这些词的意思略有不同。我不知道过去是怎样的。但是现在析构函数被继承了。查看此链接了解更多信息(查看最后的示例):@RononDex链接到的页面第3点声明“终结器无法继承”,这与您的评论相矛盾。无可否认,这有点令人困惑,因为虽然它们不能被继承,“继承链中的所有实例都递归地调用
    Finalize
    方法,从派生度最高的实例到派生度最低的实例”。但请注意,这与可继承析构函数的行为不同。@MarkAmery啊,我明白了,所以基本上它们的调用顺序与继承的东西相反?正确的术语应该是析构函数/终结器,而不是解构器。解构器是指解构构造函数的语法。