2012-03-06 33 views
1

以下是调用事件并通知所有客户端的函数。为什么在C#中将虚拟对象传递给事件处理程序?

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

这是一个示例代码。

我想知道的是“什么是new object()

意义在于这句法遵循或只针对这种情况呢?

+1

如果你没有它,那么你怎么知道事件来自谁?以及如何处理基于发件人类型的事件? – Zenwalker 2012-03-06 04:44:40

+0

对象类型的发送参数有助于了解哪个事件引发了事件处理程序? – 2012-03-06 04:45:50

+0

不,谁提出来的。第二个参数会告诉你发生了什么样的事件 – Zenwalker 2012-03-06 05:10:49

回答

8

通常你通过作为事件处理程序的sender参数。

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

+1

+1,与我的答案相同,但更详细。 – Mufaka 2012-03-06 04:44:33

+0

如何通过NULL帮助? – 2012-03-06 04:46:44

+2

因为那样你不会为每个单个事件调用创建另一个新对象。 – SimonC 2012-03-06 04:55:29

2

这个参数是事件的发送者。通常情况下,你将使用this,但不会在静态环境中工作。

1

EventXYZ似乎已被写入期望发件人(通常与事件处理程序)。在静态的“开”blahBlah事件提升者的情况下,发件人是不是真的处理得很清楚。正如另一个响应者发布的,它似乎试图满足传递给处理程序的事件参数的sender属性。

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

在这种情况下使用“新对象()”似乎像混淆绒毛,恕我直言。但是,再次,我们没有技术上知道在这种情况下使用的构造函数的签名......也许第一个参数意味着“一些随机对象,将用作我们以后可能会责备的事情,当你的努力驱动器得到格式化“..也许一个新的,空的,毫无意义的对象是完美的。

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

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

..总而言之,这是一个典型的“发件人作为第一个参数”模式,你在看99事件参数/事件处理程序的百分比。更好的例子可能会更有意义。

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

编辑:顺便说一句,这是不寻常的,看到静态OnEvent提高者......这有点奇怪。不是技术上的正确,但它肯定会扰乱典型的“'这'作为发件人'模式。

干杯!

相关问题