【问题标题】:How To Delete Lost Instance From Collection?如何从集合中删除丢失的实例?
【发布时间】:2021-11-05 15:59:59
【问题描述】:

所以,假设我有这样的事情:

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();
    }

}

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

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

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

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

如果我应该以另一种方式做,或者我做错了什么,谁能告诉我?
以防万一,我正在与 Unity 合作。

谢谢!

编辑:这里是单例类。它旨在与 Unity GameObjects 一起使用,它是一个相当大的实现,所以我将链接一个文件:UnitySingleton

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

【问题讨论】:

  • 你介意分享一下“Singleton”类的代码吗?
  • @Lyxodius 我可能错了,但很有可能是this implementation
  • 设置Foo的新值时,不能先检查foo是否存在,如果存在就调用Dispose函数吗? if (this.foo != null) this.foo.Dispose();
  • @Lyxodius 我刚刚编辑了问题并添加了代码。
  • @TEEBQNE 实际上我确实将那个实现作为参考,你完全没有错。

标签: c# unity3d collections garbage-collection instance-variables


【解决方案1】:

你是对的,如果你的代码是这样写的,就没有办法做到这一点。您需要存储对要处理的 Foo 的引用。

【讨论】:

    猜你喜欢
    • 2017-03-16
    • 2012-02-13
    • 1970-01-01
    • 2015-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多