首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Invoke方法(Delegate)和直接调用有什么区别吗?

Invoke方法(Delegate)和直接调用有什么区别吗?
EN

Stack Overflow用户
提问于 2013-08-28 20:27:57
回答 1查看 10.8K关注 0票数 29

可能是我之前问过这个问题,我用谷歌搜索了一下,但没有得到答案。

委托原型

代码语言:javascript
复制
delegate void method1(string str);

添加回调方法

代码语言:javascript
复制
method1 objDel2;           
objDel2 = new method1(TestMethod1);            
objDel2("test");
objDel2.Invoke("Invoke");

在上面的代码中,objDel2("test");objDel2.Invoke("Invoke");做的是相同的task.Which,其中一个是好的,或者两个都是相同的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-08-28 20:29:03

它们是100%相同的-这是纯粹的编译器糖(见下文)。至于哪个更好:两者都不是/都是。

代码语言:javascript
复制
static class Program {

    static void Main()
    {
        method1 objDel2;
        objDel2 = new method1(TestMethod1);
        objDel2("test");
        objDel2.Invoke("Invoke");
    }
    delegate void method1(string val);
    static void TestMethod1(string val) {
        System.Console.WriteLine(val);
    }
}

有IL

代码语言:javascript
复制
.method private hidebysig static void Main() cil managed
{
    .entrypoint
    .maxstack 2
    .locals init (
        [0] class Program/method1 'method')
    L_0000: ldnull 
    L_0001: ldftn void Program::TestMethod1(string)
    L_0007: newobj instance void Program/method1::.ctor(object, native int)
    L_000c: stloc.0 
    L_000d: ldloc.0 
    L_000e: ldstr "test"
    L_0013: callvirt instance void Program/method1::Invoke(string) ***HERE***
    L_0018: ldloc.0 
    L_0019: ldstr "Invoke"
    L_001e: callvirt instance void Program/method1::Invoke(string) ***HERE***
    L_0023: ret 
}

注意两者都做同样的事情(请看我标记为***HERE***的两个位置)

票数 51
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18487913

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档