没有调用终结器

Spe*_*uku 5 c# finalizer

我在C#中有一个类,我想在我的课程处理时正确地关闭一些通信端口.但是,退出程序时永远不会调用终结器.这是为什么?难道我做错了什么?

我正在手动调用dispose,它会通过并关闭所有通信.这也没有解雇.

这是我正在使用的终结器:

~Power()
{
    Dispose(false);
}
Run Code Online (Sandbox Code Playgroud)

Ree*_*sey 8

终结器(这是你在这里使用的)仅在结束阶段被调用,这将在GC期间发生.

如果正确实现IDisposable,则永远不应该调用它.我在IDisposable系列中详细介绍了这一点.

话虽这么说,如果你的"通信端口"是通过托管类处理的,你根本不应该使用终结器.这增加了开销,对您没有任何帮助.只需实现IDisposable(正确),并让端口类的托管包装器在需要时处理终结.


Han*_*ant 6

如果一棵树落在森林里,周围没有人听到,它会发出声音吗?确保它确实:

using System;

class Program {
    static void Main(string[] args) {
        new Test();
    }
}

class Test {
    ~Test() { Console.Beep(); }
}
Run Code Online (Sandbox Code Playgroud)

程序终止时留下的任何对象的终结器在进程终止之前被调用.这种情况不会发生的唯一方法就是当这个过程被粗暴地中止时.例如,Environment.FailFast().


15e*_*153 5

C#终结器不能保证在任何特定时间被调用。不应将它们误认为C ++析构函数。

如果要保证可预测的处置,请实现IDispose并在using块中实例化您的类:

using (Power power = new Power())
{
    //  blah blah
}
Run Code Online (Sandbox Code Playgroud)

如果using块不切实际,则实现IDispose-您必须编写一个Dispose方法,该方法可以处理需要释放的所有资源。有关所有确切要求,请参见MSDN在线-并在适当的时间显式调用Dispose()。如果您是多线程的,则可能需要一些同步代码以确保不会太早发生。