委托
概念:委托是方法的容器,是类。跟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
浙公网安备 33010602011771号