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);

 

posted @ 2024-07-26 18:47  别动我的猫  阅读(20)  评论(0编辑  收藏  举报