为什么在C#中将虚拟对象传递给事件处理程序?

时间:2012-03-06 04:37:37

标签: c# events

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

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

这是来自示例代码。

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

这是一种语法,还是只针对这种情况?

3 个答案:

答案 0 :(得分:8)

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

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

答案 1 :(得分:2)

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

答案 2 :(得分:1)

EventXYZ似乎是为了期待发送者(典型的事件处理程序)而编写的。在静态的“On”blahBlah事件提升者的情况下,发送者并没有真正处理清楚。正如另一个响应者发布的那样,它似乎是试图满足传递给处理程序的事件args的sender属性。

更正确的实现可能会从EventArgs中省略发送者,或者允许静态“OnBlahBlah”方法允许调用者指定发送者。

在这种情况下使用“new object()”看起来像混淆绒毛,恕我直言。但是,再说一遍,我们在技术上并不知道在这种情况下使用的构造函数的签名......也许第一个参数意味着“一些随机对象将被用作我们可以在你的硬盘后责怪的东西驱动器被格式化“..也许一个新的,空的,毫无意义的对象是完美的。

要寻找的另一件事是你可以考虑重写代码:

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

..简而言之,这是典型的“发件人作为第一个参数”模式,您可以在99%的事件参数/事件处理程序中看到这种模式。更好的例子可能更有意义。

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

编辑:顺便说一句,看到静态的OnEvent加注器是不寻常的......这有点奇怪。技术上不正确,但它肯定会把典型的“'这个'作为发送者”模式混淆。

干杯!