如何从 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();
}
}
我的问题基本上是,创建时注册到 FooEventEmitter
的 Foo
的第一个值会发生什么?有什么方法可以访问它并从 Instances
的 collection 中删除它,它在丢失唯一引用后得到更新?
如果有人想知道我正在尝试做什么,我正在尝试的基本上是有一个像 Foo
这样的 class,它通过事件提供一些功能。这些事件需要持续评估以检查它们是否应该被调用,但它们不能被拥有的实例持续评估(至少不是 public 方式)。
这就是我使用私有“实例管理器”(用户不需要知道它的存在)的原因,它可以更新并评估每个实例以便在必要时调用事件。
问题是,如果我更改 Test
class 的变量 foo
中的值,当我不再需要第一个实例时,它会继续求值,因为我失去了访问它的方式。设置 new Foo
值后,如何从“实例管理器”中删除第一个实例?还是根本做不到?
如果我应该换一种方式或者我做错了什么,有人能告诉我吗?
如果这样说可能会有帮助,我正在使用 Unity。
谢谢!
编辑: 这是单例 class。它旨在与 Unity GameObjects 一起使用,并且它是一个相当大的实现,所以我将 link 一个文件:UnitySingleton.
另外,请考虑到用户可能不知道 Foo
在更新它的值之前应该被处置。我正在尝试寻找一种自动为他做的方法。
你说的对,你的代码这么写是没办法的。您需要存储对要处理的 Foo 的引用。
所以,假设我有这样的东西:
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();
}
}
我的问题基本上是,创建时注册到 FooEventEmitter
的 Foo
的第一个值会发生什么?有什么方法可以访问它并从 Instances
的 collection 中删除它,它在丢失唯一引用后得到更新?
如果有人想知道我正在尝试做什么,我正在尝试的基本上是有一个像 Foo
这样的 class,它通过事件提供一些功能。这些事件需要持续评估以检查它们是否应该被调用,但它们不能被拥有的实例持续评估(至少不是 public 方式)。
这就是我使用私有“实例管理器”(用户不需要知道它的存在)的原因,它可以更新并评估每个实例以便在必要时调用事件。
问题是,如果我更改 Test
class 的变量 foo
中的值,当我不再需要第一个实例时,它会继续求值,因为我失去了访问它的方式。设置 new Foo
值后,如何从“实例管理器”中删除第一个实例?还是根本做不到?
如果我应该换一种方式或者我做错了什么,有人能告诉我吗?
如果这样说可能会有帮助,我正在使用 Unity。
谢谢!
编辑: 这是单例 class。它旨在与 Unity GameObjects 一起使用,并且它是一个相当大的实现,所以我将 link 一个文件:UnitySingleton.
另外,请考虑到用户可能不知道 Foo
在更新它的值之前应该被处置。我正在尝试寻找一种自动为他做的方法。
你说的对,你的代码这么写是没办法的。您需要存储对要处理的 Foo 的引用。