你的问题很有趣,我不知道在 C# 中有任何其他方法可以做到这一点,而是从实例内部强制它从外部破坏。所以这就是我想出的检查是否可能的方法。您可以创建类Foo
,该类具有在计时器的特定间隔过去时触发的事件。在事件中注册到该事件 ( Bar
) 的类取消注册该事件并将实例的引用设置为null
。这就是我的做法,经过测试并且有效。
public class Foo
{
public delegate void SelfDestroyer(object sender, EventArgs ea);
public event SelfDestroyer DestroyMe;
Timer t;
public Foo()
{
t = new Timer();
t.Interval = 2000;
t.Tick += t_Tick;
t.Start();
}
void t_Tick(object sender, EventArgs e)
{
OnDestroyMe();
}
public void OnDestroyMe()
{
SelfDestroyer temp = DestroyMe;
if (temp != null)
{
temp(this, new EventArgs());
}
}
}
public class Bar
{
Foo foo;
public Bar()
{
foo = new Foo();
foo.DestroyMe += foo_DestroyMe;
}
void foo_DestroyMe(object sender, EventArgs ea)
{
foo.DestroyMe -= foo_DestroyMe;
foo = null;
}
}
为了测试这一点,您可以在表单中设置一个按钮单击,类似这样,并在调试器中检查它:
Bar bar = null;
private void button2_Click(object sender, EventArgs e)
{
if(bar==null)
bar = new Bar();
}
因此,下次单击按钮时,您将能够看到该Bar
实例仍然存在,但其中的Foo
实例为 null,尽管它是在Bar
的构造函数中创建的。