3

我有一个类会产生另一个 UI 线程并做到这一点。每当我的父类被销毁时,我都需要中止该线程并进行清理。那么我怎么知道我的父类何时被破坏?

来自 C++,我的第一个想法是把它放在析构函数中。但是 C# 并没有真正的析构函数——只有终结器和处置——据我了解——可能会或可能不会被调用(我想这对 GC 来说是一种情绪??)。

这很好也很简单——如果你可能想也可能不想释放你的资源。

但是,当一个对象被销毁时,您将绝对积极必须执行的代码放在哪里?

4

4 回答 4

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模式背后的想法是它明确地告诉您何时需要处理类。这是一篇描述如何正确实现它的文章(考虑可能的后代类)。

于 2013-01-22T22:11:37.017 回答
3

当一个对象被破坏时,没有办法保证“绝对积极[将]被执行”(尝试拔掉你的电脑上的插头——不会调用终结器)

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

于 2013-01-22T22:14:27.593 回答
1

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

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

笔记:

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

来源

于 2013-01-22T22:13:29.063 回答
0

你让你的类 aComponent和包含类 a Container

请参阅:C# - 什么是组件以及它通常如何使用?

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

于 2013-01-22T22:13:13.960 回答