【发布时间】:2011-10-12 16:25:08
【问题描述】:
我认为这是一个 C# 初学者问题,但我似乎找不到正确的解决方案。
我有一个 ClassOne 对象,它定义了一个事件。 我创建了一个 ClassTwo 对象,它被认为是一个黑盒子,这意味着我不知道它是否会注册到任何事件。 ClassTwo 构造函数注册到 ClassOne 的事件。 当 ClassTwo 对象超出范围时,问题就来了。垃圾收集器从不删除此对象,因为它从未取消注册该事件。
所以我有两个问题:
有没有办法让 ClassTwo 对象知道何时超出范围?对于老 C++ 程序员来说,这将在析构函数中,但对于 C#,这不起作用。
是否有调试工具可以帮助我找到此类对象?
这里是重现问题的示例代码:
public partial class MainWindow : Window
{
static public ClassOne classOne = new ClassOne();
public MainWindow()
{
InitializeComponent();
ClassTwo classtwo = new ClassTwo();
}
private void buttonTest_Click(object sender, RoutedEventArgs e)
{
GC.Collect();
}
}
public class ClassOne
{
public ClassOne()
{
Trace.WriteLine(this + " constructor");
}
~ClassOne()
{
Trace.WriteLine(this + " destructor");
}
public delegate void UpdateFunc(object sender, EventArgs args);
public event UpdateFunc OnUpdate;
}
public class ClassTwo
{
public ClassTwo()
{
Trace.WriteLine(this + " constructor");
MainWindow.classOne.OnUpdate += new ClassOne.UpdateFunc(classOne_OnUpdate);
}
void classOne_OnUpdate(object sender, EventArgs args)
{
throw new NotImplementedException();
}
~ClassTwo()
{
Trace.WriteLine(this + " destructor");
}
}
【问题讨论】:
-
您是否希望实现
IDisposable? -
+1 优秀问题!事件比乍一看要复杂得多。
-
附带说明,如果您将终结器称为析构函数,您可能应该阅读Everybody thinks about garbage collection the wrong way。
-
@delnan:我认为 OP 已经理解了这个概念,这只是一个轻微的命名问题(即习惯)。这并不意味着 OP 没有正确理解它。
-
FWIW,该语言第一个版本的正式名称是析构函数。由于它造成的混乱,它被改变了。
标签: c# events garbage-collection destructor