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无论如何都有助于改善,所以它不会变得更难。
答案 0 :(得分:2)
使用object sender, EventArgs e
表示事件,MyRelevantClass data
表示回调。
我的定义对于此上下文将是这样的:事件可以源自多个位置,并且许多实体可以监听它 - 每个都需要(一部分)数据。回调是系统特定的,特定于上下文的,与松耦合的消息传递相比,它更接近强耦合继承/多态。
为什么发件人和活动?
如果您突然需要知道系统的哪个部分导致新客户端连接,该怎么办?如果要将元数据添加到该特定连接,该怎么办? (有任何重试吗?我们知道这个IP吗?它在本地网络上吗?我们想要覆盖TTL吗?等等)。使用传统的object sender, EventArgs e
签名可以使用此功能干净地扩展代码,而无需重写代码,除非您需要其他数据。
对于准备可能需要添加数据的情况非常重要的事件,您应该尽量保持在Open-Closed Principle范围内。 传统的签名使这更容易,被认为是最佳实践。