以下是调用事件并通知所有客户端的函数。为什么在C#中将虚拟对象传递给事件处理程序?
public static void OnEventXYZ(XYZEventArgs e)
{
if(EventXYZ!=null)
EventXYZ(new object(),e);
}
这是一个示例代码。
我想知道的是“什么是new object()
?
意义在于这句法遵循或只针对这种情况呢?
以下是调用事件并通知所有客户端的函数。为什么在C#中将虚拟对象传递给事件处理程序?
public static void OnEventXYZ(XYZEventArgs e)
{
if(EventXYZ!=null)
EventXYZ(new object(),e);
}
这是一个示例代码。
我想知道的是“什么是new object()
?
意义在于这句法遵循或只针对这种情况呢?
这个参数是事件的发送者。通常情况下,你将使用this
,但不会在静态环境中工作。
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提高者......这有点奇怪。不是技术上的正确,但它肯定会扰乱典型的“'这'作为发件人'模式。
干杯!
如果你没有它,那么你怎么知道事件来自谁?以及如何处理基于发件人类型的事件? – Zenwalker 2012-03-06 04:44:40
对象类型的发送参数有助于了解哪个事件引发了事件处理程序? – 2012-03-06 04:45:50
不,谁提出来的。第二个参数会告诉你发生了什么样的事件 – Zenwalker 2012-03-06 05:10:49