委托
概念:委托是方法的容器,是类。跟JavaScript的回调函数一样,把方法作为参数传入方法执行;
一、简单例子
/// <summary> /// 声明一个委托,需要与执行的方法的前面一样 /// </summary> public delegate void TestDelegate(); class Program { static void Main(string[] args) { //实例一个委托对象,相当于指针指向M1 TestDelegate td = new TestDelegate(M1); //调用委托,相当于调用M1 td.Invoke();//td(); } /// <summary> /// 声明委托装的这个方法 /// </summary> static void M1() { Console.WriteLine("委托执行这个方法,方法签名跟委托一样"); } }
二、反编译
查看IL代码,可以看到本质就是一个类。继承MulticastDelegate
翻译一下:
public class TestDelegate.MulticastDelegate{ public TestDelegate(object @object, IntPtr method); public virtual IAsyncResult BeginInvoke(string name, AsyncCallback callback, object @object); public virtual void EndInvoke(IAsyncResult result); public virtual void Invoke(string name); }
三、匿名方法和lambda表达式
A:方法只用一次,但是却要声明,我们可以用匿名方法解决。顾名思义,就是没有名字的方法。代替上面的M1方法 TestDelegate td = new TestDelegate(delegate() { Console.WriteLine("委托执行这个方法,方法签名跟委托一样"); }); B:匿名方法写个delegate看起来不太友好,可以用lambda表达式 TestDelegate td = new TestDelegate(() => Console.WriteLine("委托执行这个方法,方法签名跟委托一样")); C:lambda注意点 有参数的话,我们直接在前面的括号写,不用写类型,因为是传的方法指针,执行委托的时候才是执行方法,才有参数填入。其二,参数类型跟委托跟对应的,委托定义好了。 只有一句语句,可以省略大括号() =>{ Console.WriteLine("委托执行这个方法,方法签名跟委托一样");}. 是返回值,只有一句语句,也可以省略return