C#析构函数在哪里

时间:2013-01-22 22:09:10

标签: c# memory-management

我有一个产生另一个UI线程的类并且做了它。我需要中止该线程并在我的父类被销毁时清理。那么我如何知道我的父类何时被毁坏?

来自C ++我首先想到的是将它放在析构函数中。但是C#并没有任何析构函数 - 只有终结器和处理器 - 根据我的理解 - 可能会也可能不会被调用(我猜这对于GC来说是一种心情?)。

这非常简单 - 如果您可能想要或不想释放您的资源。

但是,只要对象被销毁,你在哪里放置绝对必须执行的代码?

4 个答案:

答案 0 :(得分:5)

您将其放入Dispose(实现IDisposable接口),然后确保在不再需要该对象时调用Dispose。有一种语言结构可以做到这一点:

using (var foo = new Foo())
{
    // Do something with foo.
}

foo.Dispose将在using块的末尾调用。这相当于:

{
    var foo = new Foo();
    try
    {
        // Do something with foo.
    }
    finally
    {
        foo.Dispose();
    }
}

请注意,当对象离开作用域时,Dispose会自动调用 ;你需要自己动手,使用using块或明确地调用它。

但是,您应该在Foo中提供一个调用Dispose的终结器,这样如果在GC到达之前没有丢弃该对象,则不会留下未发布的资源:

~Foo()
{
    Dispose();
}

IDisposable模式背后的想法是它明确告诉你类何时需要处理。 Here's an article描述了如何正确实现它(考虑可能的后代类)。

答案 1 :(得分:3)

当一个物体被摧毁时,没有办法保证“绝对正确[将]执行”的东西(尝试拔掉你的PC上的插头 - 终结者不会被召唤)

你可以期待的最好的是终结器 - 使用C ++析构函数语法在C#中定义。虽然,您最好实现IDisposable,并使用using{}块。

答案 2 :(得分:1)

尽管使用此方法并不常见,但您可以使用~字符在C#中定义“析构函数”,如下所示:

class Parent
{
    ~Parent()  // destructor
    {
        // cleanup statements...
    }
}

注意:

  

析构函数隐式调用了基类的Finalize   对象

source

答案 3 :(得分:0)

您将课程设为Component,将课程设为Container

请参阅:C# - What is a component and how is it typically used?

其他答案似乎忙于“超出范围”用例。但“每当我的父类被摧毁”时?如果“父类”是“包含对象”,则组件 是正确的工具。