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

rem*_*dao 33 c# delegates

delegate void DelegateTest();

DelegateTest delTest;
Run Code Online (Sandbox Code Playgroud)

电话delTest.Invoke()delTest()?之间的区别是什么?两者都会在当前线程上执行委托,对吧?

Ric*_*ard 43

delTest()形式是编译器辅助,它的下面是真正的调用Invoke().

  • @Richard:Invoke() 内部做了什么。这个 Invoke 方法到底驻留在哪里。我在Delegate和MultiCastDelegate的元数据文件中没有找到。 (3认同)
  • @Jose:它们是 CLR 内部实现的一部分,可能被 JIT 编译器直接理解。 (3认同)
  • 理查德,我几乎不得不拿走你的投票,因为你在你的个人资料中拼错了"rotorua";) (2认同)

ili*_*ode 5

Richard的答案是正确的,但是从C#6.0开始,Invoke()由于添加了空条件运算符,在某些情况下直接使用可能会比较有利。根据MS docs-

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

var handler = this.PropertyChanged;
if (handler != null)  
    handler(…);
Run Code Online (Sandbox Code Playgroud)

新方法要简单得多:

PropertyChanged?.Invoke(…)   
Run Code Online (Sandbox Code Playgroud)

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