c# 事件 vs List<Func<Args>>
c# events vs List<Func<Args>>
有什么不同吗,例如在使用 C# event
与 List<Func<MyArgs>>
之间,功能或性能、内存较少,这是我对我将调用的事件的理解方式
obj.MyClickEvent += handler;
在列表中
obj.MyOnClickFuncs.Add(clickFunc);
现在 List<Func<Args>>
方法似乎简单多了
事件为希望订阅事件的代码提供了更严格的API:
- 他们可以订阅
- 他们可以退订
(理论上,底层事件概念也提供了一种“引发”机制,但 C# 事件并未实现该机制,我怀疑它实际上已经过时了——我怀疑是因为它违反了此答案中描述的隔离。)
他们无能为力。例如,这适用于您的“只公开一个列表”方法,但不适用于事件:
obj.MyOnClickFuncs.Clear();
与事件类似,订阅者无法调用其他订阅者的处理程序 - 而他们可以使用列表方法。
换句话说,事件在订阅者之间提供了更多的隔离。如果您不关心这种隔离,那么继续公开一个列表。我个人认为隔离是一件好事。关于事件,有很多我不喜欢的东西,但提供的隔离不是其中之一:)
有什么不同吗,例如在使用 C# event
与 List<Func<MyArgs>>
之间,功能或性能、内存较少,这是我对我将调用的事件的理解方式
obj.MyClickEvent += handler;
在列表中
obj.MyOnClickFuncs.Add(clickFunc);
现在 List<Func<Args>>
方法似乎简单多了
事件为希望订阅事件的代码提供了更严格的API:
- 他们可以订阅
- 他们可以退订
(理论上,底层事件概念也提供了一种“引发”机制,但 C# 事件并未实现该机制,我怀疑它实际上已经过时了——我怀疑是因为它违反了此答案中描述的隔离。)
他们无能为力。例如,这适用于您的“只公开一个列表”方法,但不适用于事件:
obj.MyOnClickFuncs.Clear();
与事件类似,订阅者无法调用其他订阅者的处理程序 - 而他们可以使用列表方法。
换句话说,事件在订阅者之间提供了更多的隔离。如果您不关心这种隔离,那么继续公开一个列表。我个人认为隔离是一件好事。关于事件,有很多我不喜欢的东西,但提供的隔离不是其中之一:)