我有一个类会产生另一个 UI 线程并做到这一点。每当我的父类被销毁时,我都需要中止该线程并进行清理。那么我怎么知道我的父类何时被破坏?
来自 C++,我的第一个想法是把它放在析构函数中。但是 C# 并没有真正的析构函数——只有终结器和处置——据我了解——可能会或可能不会被调用(我想这对 GC 来说是一种情绪??)。
这很好也很简单——如果你可能想也可能不想释放你的资源。
但是,当一个对象被销毁时,您将绝对积极必须执行的代码放在哪里?
我有一个类会产生另一个 UI 线程并做到这一点。每当我的父类被销毁时,我都需要中止该线程并进行清理。那么我怎么知道我的父类何时被破坏?
来自 C++,我的第一个想法是把它放在析构函数中。但是 C# 并没有真正的析构函数——只有终结器和处置——据我了解——可能会或可能不会被调用(我想这对 GC 来说是一种情绪??)。
这很好也很简单——如果你可能想也可能不想释放你的资源。
但是,当一个对象被销毁时,您将绝对积极必须执行的代码放在哪里?
您将其放入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
模式背后的想法是它明确地告诉您何时需要处理类。这是一篇描述如何正确实现它的文章(考虑可能的后代类)。
当一个对象被破坏时,没有办法保证“绝对积极[将]被执行”(尝试拔掉你的电脑上的插头——不会调用终结器)
您可以期待的最好的结果是终结器——在 C# 中使用 C++ 析构函数语法定义。虽然,最好实现 IDisposable 并使用using{}
块。
虽然这种方法并不常见,但您可以在 C# 中使用~
字符定义“析构函数”,如下所示:
class Parent
{
~Parent() // destructor
{
// cleanup statements...
}
}
笔记:
析构函数隐式调用对象基类的 Finalize。
(来源)
你让你的类 aComponent
和包含类 a Container
。
其他答案似乎忙于“超出范围”用例。但是“每当我的父类被破坏时”?如果“父类”是“包含对象”,那么组件就是正确的工具。