C# Delegate.Invoke和Delegate()之间的差异

C# Delegate.Invoke和Delegate()之间的差异,c#,delegates,C#,Delegates,调用delTest.Invoke()和delTest()有什么区别?两者都将在当前线程上执行委托,对吗?没错。两者的结果完全相同 当然,假设您已经正确初始化了delTest。delTest()表单是一个编译器助手,它下面实际上是调用Invoke()Richard的答案是正确的,但是从C#6.0开始,有一种情况是使用Invoke()由于添加了。根据MS文档: null条件成员访问的另一个用途是以线程安全的方式调用委托,而代码要少得多。旧方法需要如下代码: delegate void Delegat

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

没错。两者的结果完全相同


当然,假设您已经正确初始化了
delTest

delTest()表单是一个编译器助手,它下面实际上是调用
Invoke()

Richard的答案是正确的,但是从C#6.0开始,有一种情况是使用
Invoke()
由于添加了。根据MS文档:

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

delegate void DelegateTest();

DelegateTest delTest;
新方法简单得多:

var handler = this.PropertyChanged;
if (handler != null)  
    handler(…);
新方法是线程安全的,因为编译器只生成一次计算PropertyChanged的代码,将结果保留在临时变量中。您需要显式调用Invoke方法,因为没有null条件委托调用语法PropertyChanged?(e)


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

PropertyChanged?.Invoke(…)   
白细胞介素


理查德,因为你在个人资料中拼错了“rotorua”,我差点就把你的选票拿走了;)@理查德:Invoke()在内部做什么。这个调用方法确切地驻留在哪里。我在Delegate和MultiCastDelegate的元数据文件中没有找到。@Jose:它们是CLR内部实现的一部分,可能是JIT编译器可以直接理解的。@Richard:谢谢您的回复。后来我在SO上遇到了一个类似的问题。还有一个问题,代理的DynamicVoke做什么?我在一些论坛上读到过,他们谈到了晚绑定。我不明白它的用法。@Jose:它是MethodInfo的委托等价物。在使用反射动态执行方法时调用:将参数作为
obbject[]
传递并返回
object
。如果
delTest
null
,这两个语法再次导致相同的结果(在这种情况下,从尝试调用的行中抛出一个
NullReferenceException
)。
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
MyDelegate mydelegate = null;
mydelegate?.Invoke("Reza");
mydelegate("Reza"); // Error: System.NullReferenceException