gpt4 book ai didi

c# - MethodInvoker 的这两种用法之间的区别

转载 作者:太空宇宙 更新时间:2023-11-03 15:56:58 26 4
gpt4 key购买 nike

MethodInvoker 的这两种用法到底有什么区别:

1:

textBox1.Invoke(new MethodInvoker(b));

2:

textBox1.Invoke((MethodInvoker)delegate { b(); });

我只知道,变体 2 允许我在需要时使用参数调用 b()。但这两个版本有什么区别?

版本 1 对我来说很清楚:我创建了一个新委托(delegate)并将我的 b() 方法传递给它,该方法具有与 MethodInvoker 委托(delegate)相同的返回类型和参数。委托(delegate)的标准情况。

但是版本 2 到底是什么?这里的“delegate”关键字是什么意思?

最佳答案

I only understand, that variant 2 allow me to call b() with parameters if i want.

不,即使是第一个版本你也可以做到:

textBox1.Invoke(new MethodInvoker(b), parameter1, parameter2);

But what is the difference between this 2 versions?

在第二个版本中有一个额外的委托(delegate)被调用(它的主体只是调用b())。这可能有一些用例(例如,如果您需要一个闭包,请参阅后面的内容),但在这种情况下它没有任何意义。

But what does version 2 exactly? What means/does here the "delegate" keyword?

这是一个匿名方法,如果您检查生成的代码,您会发现它在某种程度上等同于此:

void MyAnonymousMethod() {
b();
}

void b() {
}

...

textBox1.Invoke(new MethodInvoker(MyAnonymousMethod));

如您所见,它(在本例中)毫无用处,因为您添加了无用的扩展委托(delegate)调用。如果您使用它来捕获变量,它可能会有用:

int a = CalculateValueA();
textBox1.Invoke((MethodInvoker)delegate {
b(a / CalculateValueC(), anotherParameter);
});

请注意,这与此有很大不同:

int a = CalculateValueA();
textBox1.Invoke(new MethodInvoker(b), a / CalculateValueC());

因为 何时 函数将被调用并对表达式求值。要了解所有含义,另请参阅 MSDN 以了解有关 C# 中闭包的详细信息。手工编写的相同代码编写起来会复杂得多(您需要定义类来保存参数/函数调用)。快速检查反编译代码将使这一点更加清楚。

另一种常见情况是您必须适应 方法原型(prototype)。 MethodInvoker 不是这种情况,但您可能想调用一个方法 - 比方说 - 没有来自事件的参数(使用 objectEventArgs参数)。在这种情况下,您有一些选择:

  • 使用适当的原型(prototype)创建一个事件处理程序方法,然后简单地调用您想要的方法。
  • 创建一个匿名委托(delegate)(就像您所做的那样或使用 lambda)。不要忘记匿名委托(delegate)不能简单地从事件处理程序中分离...

关于c# - MethodInvoker 的这两种用法之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23219061/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com