delegate void DelegateTest();
DelegateTest delTest;
Run Code Online (Sandbox Code Playgroud)
电话delTest.Invoke()
和delTest()
?之间的区别是什么?两者都会在当前线程上执行委托,对吧?
Ric*_*ard 43
该delTest()
形式是编译器辅助,它的下面是真正的调用Invoke()
.
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)。