什么是在C#中实现链式事件的最佳方式

什么是在C#中实现链式事件的最佳方式,第1张

概述我有以下场景.客户端代码只能访问FooHandler,而不能直接访问Foo实例. public delegate void FooLoaded(object sender, EventArgs e);class Foo { public event FooLoaded loaded; /* ... some code ... */ public void Load() 我有以下场景.客户端代码只能访问FooHandler,而不能直接访问Foo实例.
public delegate voID Fooloaded(object sender,EventArgs e);class Foo {    public event Fooloaded loaded;    /* ... some code ... */    public voID Load() { load_asynchronously(); }    public voID callMeWhenLoadingIsDone() { loaded(this,EventArgs.Empty); }}class FooHandler {    public event Fooloaded OneFooloaded;    /* ... some code ... */    public voID LoadAllFoos() {         foreach (Foo f in FooList) {             f.loaded += new Fooloaded(foo_loaded);            f.Load();         }     }    voID foo_loaded(object sender,EventArgs e) {        OneFooloaded(this,e);    }}

然后客户端将使用FooHandler类的OneFooloaded事件来获取加载foos的通知.这个’事件链接’是正确的吗?还有其他选择吗?我不喜欢这个(感觉不对,我无法准确地表达原因),但如果我希望处理程序成为访问点,我似乎没有很多选择.

解决方法 如果感觉不对,因为事件比内部通信所需的更复杂,更外向(我认为至少部分是真的,考虑到事件可以调用多个客户,而你知道你只需要通知一个,对吧?),那么我提出以下备选方案.而不是使用事件来传递Foo到FooHandler的完成,因为无论如何Foo都是内部的,你可以在构造函数或Foo的Load方法中添加一个回调参数,Foo在加载完成后可以调用它.如果您只有一个回调,则此参数可以只是一个函数,如果您有多个回调,它可以是一个接口.以下是我认为您的代码在简化的内部界面中的外观:
public delegate voID Fooloaded(FooHandler sender,EventArgs e);class Foo{  Action<Foo> callback;  /* ... some code ... */  public voID Load(Action<Foo> callback) { this.callback = callback; load_asynchronously(); }  public voID callMeWhenLoadingIsDone() { callback(this); }}class FooHandler{  public event Fooloaded OneFooloaded;  /* ... some code ... */  public voID LoadAllFoos()  {     foreach (Foo f in FooList)     {        f.Load(foo_loaded);     }  }  voID foo_loaded(Foo foo)  {     // Create EventArgs based on values from foo if necessary     OneFooloaded(this,null);  }}

请注意,这也允许您使用Fooloaded委托更强类型.

另一方面,如果感觉错误,因为事件不应该通过FooHandler到达客户端,那么1)我会争议,因为如果客户端不想处理单个Foo对象,它也不应该是在那个级别下沉它们的事件,2)如果你真的想这样做,你可以在Foo上实现一些公共回调接口,即使Foo是私有的,或者使用像Pavel建议的机制.但是,我认为客户端喜欢简单地实现更少的事件处理程序,并在一个处理程序中区分源,而不是必须连接(并可能断开)来自几十个较小对象的事件.

总结

以上是内存溢出为你收集整理的什么是在C#中实现链式事件的最佳方式全部内容,希望文章能够帮你解决什么是在C#中实现链式事件的最佳方式所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1249514.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-07
下一篇 2022-06-07

发表评论

登录后才能评论

评论列表(0条)

保存