您现在的位置是:首页 > .NET

.NET

C#委托学习(二):委托的本质

2020-11-12 09:09:19 .NET admin
上一节我们已经和大家分享了我理解的——C#中为什么需要委托,上一节中简单介绍了下委托是什么以及委托简单的应用的,在这节中将对委托做进一步的介绍的,本节主要对委本质和委托链进行讨论。一、委托的本质平时我们很容易使用委托——用C#delegat
上一节我们已经和大家分享了我理解的——C#中为什么需要委托,上一节中简单介绍了下委托是什么以及委托简单的应用的,在这节中将对委托做进一步的介绍的,本节主要对委本质和委托链进行讨论。

一、委托的本质
平时我们很容易使用委托——用C#delegate关键字定义委托,再用new操作符构造委托实例,然后通过调用委托实例来调用回调方法(就是用一个了委托对象的变量来代替方法名,这句话如果刚接触的人不好理解的话,这里给个例子:MyDelegatemydelegate=newMydelegate(obj.mymethod),MyDelegate是定义的一个委托,假设定义的是没有参数的,然后调用委托实例是这样的——mydelegate(),大家可以发现此时调用委托和调用方法的方式是一模一样的,如果没有看前面mydelegate是个委托类型,大家都会认为这是直接调用一个方法,而不是调用委托实例,通过这个例子大家应该很容易明白了这句话了吧——用一个委托对象的变量来代替方法名),相信通过括号内的讲解后,相信大家又会对委托有进一步的理解的——委托就是方法的代替品,委托变量此时着方法名,大家可以简单理解委托是方法的一个“外号”。

前面的都介绍了委托的一些使用和理解的,现在就让我我们来进一步看看编译器和CLR在背后对我们用delegate关键字定义的委托类型做了些什么事情的,前一个专题中我和大家说过委托是一个类,这么是有根据的,因为我们在IDE中定义一个委托类型时,最终是通过编译器将定义的代码转化为中间语言IL,然后再执行中间语言中的代码来转化为本机代码的,所以在VisualStudio中编写的代码只是一个包装而已,真真程序执行的是中间语言中的代码的。现在就看看编译器把我们定义的委托类型转化为什么样的中间语言代码的。

当我们在类中像下面这样定义一个委托时:
publicdelegatevoidDelegateTest(intparm);