【发布时间】:2014-02-13 08:53:46
【问题描述】:
这个问题听起来微不足道,但还是让我问吧。
我在网上找到了下面这个在VB.NET中使用Invoke调用匿名方法的例子:
Invoke(New MethodInvoker(Sub() SomeMethod(param1)))
但是为什么不这样称呼它,看起来更干净呢?有什么区别吗?
Invoke(Sub() SomeMethod(param1))
【问题讨论】:
-
不,我不这么认为。我的问题更多是关于为什么要实例化 MethodInvoker。我在问题中提出的两段代码都能正确编译并正常工作。所以 MethodInvoker 实例化似乎是多余的。我只是想确定我是否正确。
-
唯一的区别是在您的第一个示例中,您创建了一个额外的
MethodInvoker类型的委托,这是一个没有参数的简单void方法。Invoke不关心它是用MethodInvoker实例还是任何其他与其类似的委托类型调用的。文档提到使用MethodInvoker应该更快,但我认为在大多数情况下没有足够重要的差异来关心。我会坚持使用第二个示例,因为恕我直言,它更具可读性。 -
您对速度的看法是正确的。这令人难以置信,但第一个示例比第二个示例快 3 倍以上。我刚刚执行了一个简单的测试,循环调用示例代码一百万次。
-
一种解释是,编译器不会将第二个转换为
MethodInvoker委托,因为Invoke接受Delegate作为参数。并且由于当使用匿名过程Invoke需要MethodInvoker时,演员将在运行时完成,这可能会影响性能。