【问题标题】:Invoking an anonymous method调用匿名方法
【发布时间】: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 时,演员将在运行时完成,这可能会影响性能。

标签: vb.net invoke


【解决方案1】:

只是为了结束和结束这个话题。根据 cmets,Invoke 调用的两个示例都是正确的,但使用 MethodInvoker 实例化的示例更快,因为正如 MrPaulch 所说,不必在运行时执行额外的类型转换。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-20
    • 1970-01-01
    • 2016-08-05
    • 2011-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多