没有委托变量的支持,在哪些情况下使用事件是有益的?我正在阅读JonSkeet的这篇文章,作为我深入研究代表和事件的一部分。在文章中,他演示了一个没有支持它的委托变量的事件,并指出......有时您不想使用简单的委托变量来支持事件。例如,在有大量事件但只有少数可能被订阅的情况下,您可以拥有从描述事件的某个键到当前处理它的委托的映射。这就是Windows窗体所做的——这意味着您可以拥有大量事件而不会浪费大量内存和变量,这些内存和变量通常只有空值。我不太明白他在说什么。有人可以充实这些例子吗?例如,他所说的“从描述事件的某个键映射到当前处理它的代理”是什么意思?Windows窗体如何做到这一点?谢谢!您可以自己使用相同的类型-EventHandlerList。假设您有100个事件-这通常意味着100个变量,即使没有人订阅该事件,它们也会占用空间。取而代之的是,EventHandlerList有点像字典——它只会在您第一次订阅特定事件时在其内部数据结构中创建一个条目。所以你可能有类似的东西://Actualvaluesdon'tmatter;它们只是键privateconststringFirstEventKey="FirstEvent";privateconststringSecondEventKey="SecondEvent";privatereadonlyEventHandlerListevents=newEventHandlerList();公共事件EventHandlerFirstEvent{添加{events.AddHandler(FirstEventKey,value);}移除{events.RemoveHandler(FirstEventKey,value);}}publiceventEventHandlerSecondEvent{添加{events.AddHandler(SecondEventKey,value);}移除{events.RemoveHandler(SecondEventKey,value);}}publicvoidOnFirstEvent(EventArgse){EventHandlerhandler=(EventHandler)events[FirstEventKey];如果(处理程序!=null){处理程序(这个,e);}}//同样对于OnSecondEvent我想补充一点,这是我经常看到的//错误代码classMyControl:Control{publiceventEventHandlerValueChanged;私人复选框已选中;//...privatevoidInitializeComponent(){//...checked.CheckedChanged+=checked_CheckedChanged;//...}私人无效检查_CheckedChanged(objectsender,EventArgse){if(ValueChanged!=null){ValueChanged(sender,e);我认为这是一种反模式,因为这种方式更快,使用的内存更少,而且通常更简单我认为:}移除{checked.CheckChanged-=value;}}私有CheckBox选中;//...}另一种情况是普通情况,其中基类或接口为某些派生类型中从未发生的事件提供事件。例如,只读可观察集合接口可能提供CollectionChangedEvent。持有接口变量的实体将无法使用它来更改集合,但可能有兴趣知道集合是否/何时更改。这些实体应该能够使用不可变集合以及可变集合。从它的角度来看,一个不可变的集合应该看起来像一个可变的集合,在它被监视的时候没有人费心去改变它。CollectionChangedEvent最合乎逻辑的实现是使用add-and-hand-handler方法,它什么也不做,也没有支持委托字段。调用add-handler方法的外部实体本质上是“如果此集合发生变化,请给我打电话”。当它调用remove-handler方法时,它基本上是在说“我不再需要知道这个集合是否会改变”。如果集合永远不会改变,那么这些请求可以通过简单地不做任何事情来实现。以上是C#学习教程:在没有委托变量支持的情况下使用事件有什么好处?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
