我了解C#使用垃圾收集器来管理所有托管资源,当不再引用实例时,GC可能会收集它们。
但是我的问题是:是否有适当的做法来正确删除这些引用?
假设我们购买了一个动物园,在这个动物园中,我们有 1只老虎和 1个警报
public class Zoo
{
public static Action OpenZoo;
public Tiger tiger1 = new Tiger();
}
老虎订阅了OpenZoo
事件,在动物园开放时会发出声音
public class Tiger
{
public Tiger()
{
Zoo.OpenZoo += Meow;
}
private void Meow() { }
}
有一天我们想摆脱老虎,据我了解,我们不能简单地做
tiger1 = null
我们必须先让Tiger取消订阅警报,然后再使Tiger1无效,并希望gc介入或致电CG.collect。
Zoo.OpenZoo -= Meow;
tiger1 = null
在此示例中,这并不难,但可以想象我们有多个对象订阅了多个事件,并被多个对象引用等。
如果Tiger1订阅了世界上所有的youtube频道,又要摆脱这只老虎,我们又必须重新订阅所有youtube频道怎么办?您怎么能确定自己没有错过任何一个?
所以我的问题是:
有没有更好的方法来管理这种情况?