为什么要将伪对象传递给C#中的事件处理程序

本文关键字:事件处理 程序 对象 为什么 | 更新日期: 2023-09-27 18:26:43

以下是一个调用事件并通知所有客户端的函数。

public static void OnEventXYZ(XYZEventArgs e)
{
    if(EventXYZ!=null)
        EventXYZ(new object(),e);
}

这是一个示例代码。

我想知道的是"new object()的意义是什么?

这是一种语法,还是仅适用于这种情况?

为什么要将伪对象传递给C#中的事件处理程序

通常将this作为事件处理程序的sender参数传递。

但是,在这种情况下,事件是静态的,因此不能使用this。编写该样本的人选择通过new object()。我认为大多数人会通过null考试,但这实际上是个人偏好的问题。

该参数用于事件的发送方。通常,您会使用this,但这在静态上下文中不起作用。

EventXYZ似乎是为期望一个发送方而编写的(典型的事件处理程序)。在静态的"On"blahBlah事件引发器的情况下,发送者并没有得到明确的处理。正如另一个响应者发布的那样,这似乎是为了满足传递给处理程序的事件参数的sender属性。

一个更正确的实现可能会从EventArgs中省略sender,或者允许静态"OnBlahBlah"方法作为允许调用者指定sender的参数。

IMHO,在这种情况下使用"new object()"似乎有些混乱。但是,再说一遍,从技术上讲,我们不知道在这种情况下使用的构造函数的签名。。。也许第一个论点是"当你的硬盘被格式化时,一些随机对象会被用作我们可以指责的对象"。。也许一个新的、空的、无意义的物体就是完美的。

另一件需要注意的事情是,您可以考虑将代码重写为:

public static void OnEventXYZ(XYZEventArgs e)
{
    var evt = EventXYZ;
    if(evt != null)
        evt(new object(),e);
}

简而言之,这是一种典型的"sender as first argument"模式,您可以在99%的事件参数/事件处理程序中看到这种模式。更好的例子可能更有意义。

您还可以使用ILSpy或Reflector查看.NET运行时中的数千个事件引发器/处理程序,以获得如何编码常见模式的更好示例。

编辑:顺便说一句,看到静态的OnEvent引发者是不寻常的。。。这有点奇怪。技术上不正确,但它确实混淆了典型的"作为发送者"模式

干杯!