Eventhandlers设计

时间:2014-11-20 14:09:11

标签: c# design-patterns

Totaly设计导向的问题。

我见过很多像这样的自定义事件的例子:

namespace 
{
    public delegate void NewClientEvent(object sender, EventArgs e);

    class ClientListner
    {
        public event NewClientEvent ClientConnected;
    }

}

但它必须是这样的吗?如果我没有使用任何发送者的恩惠,是否有一些理由将其包括在内,或者只是为了完全合法

namespace 
{
    public delegate void NewClientEvent(Socket newclient);

    class ClientListner
    {
        public event NewClientEvent ClientConnected;
    }

}

那样只会发送相关数据? vs intelisence无论如何都有助于改善,所以它不会变得更难。

1 个答案:

答案 0 :(得分:2)

使用object sender, EventArgs e表示事件,MyRelevantClass data表示回调。

我的定义对于此上下文将是这样的:事件可以源自多个位置,并且许多实体可以监听它 - 每个都需要(一部分)数据。回调是系统特定的,特定于上下文的,与松耦合的消息传递相比,它更接近强耦合继承/多态。

为什么发件人和活动?

如果您突然需要知道系统的哪个部分导致新客户端连接,该怎么办?如果要将元数据添加到该特定连接,该怎么办? (有任何重试吗?我们知道这个IP吗?它在本地网络上吗?我们想要覆盖TTL吗?等等)。使用传统的object sender, EventArgs e签名可以使用此功能干净地扩展代码,而无需重写代码,除非您需要其他数据。

对于准备可能需要添加数据的情况非常重要的事件,您应该尽量保持在Open-Closed Principle范围内。 传统的签名使这更容易,被认为是最佳实践。