C# 委托
一、委托 DeleGate
为什么使用委托?使用前,每个功能模块,粘合度太高。使用后,每个模块都是独立的。代码追求的高内聚低耦合。
关键字delegate
语法: Public delegate returntype delegatename(parameters);
委托是有限制的,若委托有形参,那么绑定的方法也必须有。
二、多播委托
一个委托可以绑定多个方法,绑定完成后顺序执行。多绑定+=,解除-=
afterClicking2 += Method1; //绑定方法1 afterClicking2 += Method2; //绑定方法2 afterClicking2 += Method3; //绑定方法3 afterClicking2 -= Method1; //解除绑定方法1
临时方法Lambda表达式语法:(形参列表)=> {代码块};
//临时方法 afterClicking2 += (string str) => { MessageBox.Show($"我是方法4接收到数据:{str}"); };
三、事件 event
没使用事件前委托是不安全的。在类的外部能直接调用。使用后,委托只能在类的内部调用,在外部只能+=或-= ,类似于属性和字段的关系。事件是为了保护委托。
事件定义语法 Public event 委托名 变量名();
事件与委托的区别,委托就是事件,事件本质上是对委托类型的变量进行封装,类似于类的属性对字段的封装。唯一区别是事件是保护委托的一个关键字。
四、泛型委托
一般情况下,我们使用微软帮我们定义好的泛型委托就好了,避免重复定义。
Action 无返回值的泛型委托
Action<int,string> 表示有传入参数int,string无返回值的委托 Action<int,string,bool> 表示有传入参数int,string,bool无返回值的委托 Action<int,int,int,int> 表示有传入4个int型参数,无返回值的委托 Action至少0个参数,至多16个参数,无返回值。
Func 是有返回值的泛型委托
Func<int> 表示无参,返回值为int的委托 Func<object,string,int> 表示传入参数为object, string 返回值为int的委托 Func<object,string,int> 表示传入参数为object, string 返回值为int的委托 Func<T1,T2,,T3,int> 表示传入参数为T1,T2,,T3(泛型)返回值为int的委托 Func至少0个参数,至多16个参数,根据返回值泛型返回。必须有返回值,不可void
predicate 是返回bool型的泛型委托
predicate<int> 表示传入参数为int 返回bool的委托 Predicate有且只有一个参数,返回值固定为bool
五、委托的执行
线程同步执行
delegatename?.Invoke(parameters);
等同于下面的写法,如果你对上面的写法很懵逼,看下就懂了
//判断是否为空 if (null != delegatename) { delegatename(parameters);//执行委托 }
线程异步执行
delegatename?.BeginInvoke(parameters);