C#的委托与事件搭配,便是观察者模式的一种实现。函数
由于观察者模式的原理很易懂,不做多讲,本文纯粹用于记录语法。指针
//声明没有参数,没有返回值的委托类型XXXX public delegate void XXXX();
声明一个委托类型(相似typedef XXXX C++/C的函数类型)调试
注:不是产生一个对象。code
而后利用声明出来的委托类型,咱们能够利用它的对象,赋予其对应类型的函数。
从而实现出相似调用函数指针的效果。对象
//委托类型XXXX的对象 public XXXX delegateObj1; public void func1(){} public void func2(){} public void func3(int a){}
//可将某个一样类型的函数赋给该对象 delegateObj1 = func1; //调用委托对象等同于调用它表明的函数 delegateObj1();//等价于func1(); delegateObj1 = func2; delegateObj1();//等价于func2(); delegateObj1 = func3;//类型不匹配,语法错误
单纯用委托的话只能一对一调用(一次调用,一个函数触发)。事件
而经过利用事件机制,咱们能够实现一对多的调用(一次调用,多个相关事件(函数)触发)。源码
并且它添加/移除委托对象(至关于观察者模式里的观察者)的操做十分方便,使用+=或-=便可。string
//先声明一个委托类型 public delegate void XXXX(); //委托事件对象 public event XXXX EventObj1;//此处比通常委托多了个event
EventObj1 += func1; //添加 EventObj1 += func2; //添加 EventObj1(); //调用func1(),func2() EventObj1 -= func1; //移除 EventObj1(); //调用func2()
Action/Func主要是为了简化委托(delegate)语法,它们本质都是委托。io
//无返还值,不带参数的委托对象 public delegate void XXXX(); public XXXX obj1;
在上面咱们看到委托语法,必须为委托类型命名(声明委托),才能使用该委托类型。event
可是使用Action/Func能够无需声明委托类型的语句,直接利用Action<...>/Func<...>来用本身想要的委托类型。
Action和Func的源码底层实际也是delegate的封装
//无返还值,不带参数的委托对象 public Action obj3; //无返还值,带int参数的委托对象 public Action<int> obj4; //double返还值,无参数的委托对象 public Func<double> obj5; //int返还值,带string,double参数的委托对象 public Func<string,double,int> obj6; //将Action应用至事件 public event Action<int> EventObj1;
EventObj1 += obj4; EventObj1 += func1; EventObj1 += func2; EventObj1();//调用obj4(),func1(),func2()
Lambda表达式是用于简便快速写简单函数的语法,并且这些函数每每要用于委托对象。
Lambda表达式基本形式:
(参数...) => { 函数内容... }
参数在它的类型可自动推导的状况下,才能够省略参数类型。若是谨慎起见,能够不省略,从而避免隐式类型转换。
Action obj1; obj1 = () => { Debug.Log("FGNB"); }; Action<int> obj2; obj2 = (int x) => { Debug.Log(x); }; obj2 = (x) => { Debug.Log(x+233); };//也能够省略参数类型 Func<int,int> obj3 = (int x) => { return x; };