C#委托与事件个人笔记

最近做的项目中涉及到使用委托这一技术,由于之前接触过但是并没有完全弄清楚,于是写下这篇博客当做学习的记录。

这里抛出几个问题,当做学习的引导:

一.什么是委托?

二.委托怎么用?

三.什么是事件?

四. 什么是匿名方法?

五.什么是Lambda表达式?

六.什么是Action委托?

七.什么是Func委托?

一.什么是委托?

按照国际惯例,这里引用百度百科的解释:

委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法,可以避免在程序中大量使用If-Else(Switch)语句,同时使得程序具有更好的可扩展性。

通俗的讲,委托可以把方法当做(方法的)参数来传递。

二.委托怎么用?

1.委托语法

语法格式:

访问修饰符 delegate 返回值类型 委托名称(参数列表);

例如:

public delegate void CalcDelegate(int a,int b);//该委托用于a与b的计算

 

 注意事项:

①.委托声明的关键字是:delegate

②.委托声明的位置不限定

③.声明的委托要和绑定的方法的返回值类型和参数列表类型一致

使用委托时,可以像定义一个普通的string或者int类型的变量一样,来使用委托定义一个变量,然后把方法当成数据赋值给变量。

基本步骤:

①.委托类型 变量名称;    //这种方式定义一个委托类型的变量

②.变量名称 = 方法名;    //使用这种方式来给变量赋值

③.变量名称([参数列表]);    //这种方式来执行变量,就等于是间接的执行了存放在该委托变量中的方法

例如:



public delegate void CalcDelegate(int a,int b);

private CalcDelegate cal;//声明

cal = ADD;//赋值

cal();//执行

private void ADD(int a,int b){//该方法用于计算a+b的值,并且打印出来

    Debug.Log(a+b);

}

2.多播委托语法

委托变量和普通变量有一点不同,普通变量只能存放一个数据,但委托变量是一个“委托链”,里面可以存放多个数据,委托链类似于“链表”。

语法格式:

①.委托变量赋值,第一次使用“=”号

②.第二次开始就要使用“+=”进行添加,使用“-=”进行移除

③.如果已经用“=”赋过值了,再使用“=”,相当于重置赋值,之前存在委托链中的方法全部丢失

④.调用这个委托变量,执行时按赋值的先后顺序执行,执行时会把添加到该委托链中的方法全部依次执行

public delegate void CalcDelegate(int a,int b);

private CalcDelegate cal;//声明

cal = ADD;//赋值

cal += DEL;//添加方法

cal();//执行

private void ADD(int a,int b){//该方法用于计算a+b的值,并且打印出来

    Debug.Log(a+b);

}
private void Del(int a,int b){//该方法用于计算a-b的值,并且打印出来

    Debug.Log(a-b);
}

三.什么是事件?

事件是在委托的基础上扩展而来的知识点,在原有的委托变量的基础上多了一个event关键字,这个委托变量就称为事件。在外部访问时,事件比委托更加安全(不能使用“=”号)。

语法格式:

public  delegate void CalcDelegate(int a,int b);

private event CalcDelegate cal;//事件

四.什么是匿名方法?

匿名方法,从字面意思理解就是没有名字的方法或者没有方法名的方法。

开发过程中有的方法太简单,代码量不大,偶尔用一次,如果单独定义一个方法比较麻烦而且意义不大。所以这时候采用匿名方法。

语法格式:

委托类型 变量 = delegate([类型列表])

{

方法体;

};

例如:

public delegate void CalcDelegate(int a,int b);

private CalcDelegate cal;//声明 

cal = delegate(int a,int b)//输出a+b的和
{
    Debug.Log(a+b); 
};

五.什么是Lambda表达式?

一.基本概念

①.Lambda表达式,是一种代码的语法格式

②.Lambda表达式是对匿名方法语法格式的进一步简化

③.Lambda表达式可以理解为匿名方法的升级版

2.Lambda表达式语法

<1>.语法格式

委托类型 变量  =([参数列表])=>{方法体;};

<2>.语法格式分析

①.“=>”是Lambda表达式特有的符号,读为:goes to

②.若没有参数列表,()不能省略,如:()=>

③.若参数列表中只有一个参数,()可以省略

④.若方法体内只有一句代码,可以省略代码块符号,即不用写{ }

六.什么是Action委托?

Action委托是Lambda表达式的特例,最显著的特征是Action委托无返回值。

在使用Action前,必须引入"using System;"命名空间。

Action:是一个无参无返回值的内置委托类型

语法格式:

访问修饰符 Action 变量名;

例如:

private Action cal;//无参数

cal = () => Debug.Log("啥都没有");

Action<T>:有参数(1~4),无返回值

语法格式:

访问修饰符 Action<参数类型1 参数1,参数类型2 参数2,参数类型3 参数3,参数类型4 参数4> 变量名;

例如:

private Action<int,int> cal;//两个参数

cal = (int a,int b) => Debug.Log(a+b);//定义一个输出a+b的值的方法

cal(1,2);//计算1+2的值并输出

七.什么是Func委托?

Func委托是Lambda委托的特例,与Action委托不同,Func委托有返回值,Action委托无返回值。

Func委托其余方面与Action委托完全一样,具体用哪一种委托类型,依据是否有返回值。

例如:

private Func<int,int> cal;//两个参数

cal = (int a,int b)=>{ return a+b };//定义计算a与b和的方法

int result = cal();//将结果赋值给result

Debug.Log(result);//打印输出

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值