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