【发布时间】: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