如何从 Collection 中删除丢失的实例?

How To Delete Lost Instance From Collection?

所以,假设我有这样的东西:

public class Foo : IDisposable {
   
    // Singleton class accessible through FooEventEmitter.Instance
    private sealed class FooEventEmitter : Singleton <FooEventEmitter> {

        public HashSet <Foo> Instances { get; } = new HashSet<Foo>();

        // This method gets called continously.
        public void Update() {

             foreach (var instance in this.Instances) {
                 
                 if (somethingHappensAndEventShouldBeCalled)
                     instance.SomeEvent?.Invoke(); 
             }
        }

    }


    // The event to be emitted.
    public event Action SomeEvent = delegate { };


    public Foo () {

        FooEventEmitter.Instance.Instances.Add(this);
    }


    public void Dispose() {

        FooEventEmitter.Instance.Instances.Remove(this);
    }
}

而且,在代码的另一部分我这样做了:

public class Test {

    private Foo foo = null;


    // This method gets called automatically.
    public void Start() {

         this.foo = new Foo();
    } 
    
    public void SetNewValueForFoo() {

        this.foo = new Foo();
    }

}

我的问题基本上是,创建时注册到 FooEventEmitterFoo 的第一个值会发生什么?有什么方法可以访问它并从 Instances 的 collection 中删除它,它在丢失唯一引用后得到更新?

如果有人想知道我正在尝试做什么,我正在尝试的基本上是有一个像 Foo 这样的 class,它通过事件提供一些功能。这些事件需要持续评估以检查它们是否应该被调用,但它们不能被拥有的实例持续评估(至少不是 public 方式)。

这就是我使用私有“实例管理器”(用户不需要知道它的存在)的原因,它可以更新并评估每个实例以便在必要时调用事件。

问题是,如果我更改 Test class 的变量 foo 中的值,当我不再需要第一个实例时,它会继续求值,因为我失去了访问它的方式。设置 new Foo 值后,如何从“实例管理器”中删除第一个实例?还是根本做不到?

如果我应该换一种方式或者我做错了什么,有人能告诉我吗?
如果这样说可能会有帮助,我正在使用 Unity。

谢谢!

编辑: 这是单例 class。它旨在与 Unity GameObjects 一起使用,并且它是一个相当大的实现,所以我将 link 一个文件:UnitySingleton.

另外,请考虑到用户可能不知道 Foo 在更新它的值之前应该被处置。我正在尝试寻找一种自动为他做的方法。

你说的对,你的代码这么写是没办法的。您需要存储对要处理的 Foo 的引用。