繁体   English   中英

Delegate.Invoke 和 Delegate() 之间的区别

[英]Difference between Delegate.Invoke and Delegate()

delegate void DelegateTest();

DelegateTest delTest;

调用delTest.Invoke()delTest()有什么区别? 两者都会在当前线程上执行委托,对吗?

delTest()形式是一个编译器助手,在它下面实际上是对Invoke()的调用。

Richard 的回答是正确的,但是从 C# 6.0 开始,在一种情况下,由于添加了null conditional operator ,直接使用Invoke()可能是有利的。 根据 MS 文档:

空条件成员访问的另一个用途是使用更少的代码以线程安全的方式调用委托。 旧方法需要如下代码:

 var handler = this.PropertyChanged; if (handler;= null) handler(…);

新方法要简单得多:

 PropertyChanged?.Invoke(…)

新方法是线程安全的,因为编译器生成的代码仅对 PropertyChanged 求值一次,并将结果保存在一个临时变量中。 您需要显式调用 Invoke 方法,因为没有空条件委托调用语法 PropertyChanged?(e)。

这是正确的。 两者都有完全相同的结果。

鉴于您当然已经正确初始化delTest

Delegate.Invoke 和 Delegate() 是相同的。 两者都做同样的事情。 看下面的代码

static async Task Main(string[] args)
{
   MyDelegate mydelegate = new MyDelegate(CallMe);
   mydelegate.Invoke("Reza");
   mydelegate("Reza");
}

public delegate void MyDelegate(string message);
public static void CallMe(string message)
{
}

白细胞介素

IL_001a: ldarg.0
IL_001b: ldfld class TestConsole.Program/MyDelegate TestConsole.Program/'<Main>d__1'::'<mydelegate>5__1'
IL_0020: ldstr "Reza"
IL_0025: callvirt instance void TestConsole.Program/MyDelegate::Invoke(string)
IL_002a: nop
IL_002b: ldarg.0
IL_002c: ldfld class TestConsole.Program/MyDelegate TestConsole.Program/'<Main>d__1'::'<mydelegate>5__1'
IL_0031: ldstr "Reza"
IL_0036: callvirt instance void TestConsole.Program/MyDelegate::Invoke(string)
IL_003b: nop

我通常使用Invoke() ,因为您可以使用null 检查,并且通读代码的人可以更容易地看到正在使用委托。

无效检查

MyDelegate mydelegate = null;
mydelegate?.Invoke("Reza");
mydelegate("Reza"); // Error: System.NullReferenceException

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM