委托和事件的区别:
委托是一个类,该类内部维护着一个字段,指向一个方法。事件可以被看作一个委托类型的变量,通过事件注册、取消多个委托或方法。
委托可以在本类或者其他类注册函数,执行函数。
事件可以在本类或者其他类注册函数,但只能在本类中执行函数。事件可以更好的封装逻辑,保证耦合度。
什么时候使用委托,什么时候使用事件呢?
不知道,,,当回调函数只能在本类中执行时,使用事件,这算不算一个?
1,委托:
委托可以在本类或者其他类注册函数,执行函数。
delegate 是一种可用于封装命名方法或匿名方法的引用类型。 委托类似于 C++ 中的函数指针;但是,委托是类型安全和可靠的。
委托的使用:
第一次用的“=”或者“new”,是赋值的语法;
第二次,用的是“+=”,是绑定的语法。
如果第一次就使用“+=”,将出现“使用了未赋值的局部变量”的编译错误。
连续 “=” 则是全部覆盖,执行最后一次“=”的函数。
使用“-=”取消注册,多次“+=”同一个函数会多次执行该函数。
如下:最后只会执行Fun3函数。
fundelegate = new FunDelegate(Fun);
fundelegate = Fun;
fundelegate += Fun2;
fundelegate = Fun3;
fundelegate();
以下会执行3次Fun2:
mydele = Fun2;
mydele += Fun2;
mydele += Fun2;
2,事件:
事件可以在本类或者其他类注册函数,但只能在本类中执行函数。事件可以更好的封装逻辑,保证耦合度。
事件只能“+=”,“-=”,不能用“=”。
如下:Fun函数会执行2次。
eventFun += Fun;
eventFun += Fun;
eventFun();
3,使用委托注册事件,完成消息通信:
public class SenderTest : MonoBehaviour
{
public delegate void FunDelegate();
public FunDelegate fundelegate;
public event FunDelegate eventFun;
private void Start()
{
fundelegate();//当某个行为触发时,需要ReceiveTest做出相应的回应
}
}
//接受者提前注册好对应得事件
public class ReceiveTest : MonoBehaviour
{
SenderTest bs;
private void Awake()
{
bs = GetComponent<SenderTest>();
bs.fundelegate = Fun;
}
void Fun()
{
print(" fun is call ");
}
}
4,Lambda 与 匿名函数
Lambda表达式是一种可用于创建委托的匿名函数。
所有Lambda表达式都使用Lambda运算符=>,Lambda运算符的左边是输入参数(如果有),右边是表达式或语句块。
Lambda表达式可以有多个参数、一个参数,或者没有参数。其参数类型可以隐式或者显式。
示例代码如下:
(x, y) => x * y //多参数,隐式类型=> 表达式
x => x * 5 //单参数, 隐式类型=>表达式
x => { return x * 5; } //单参数,隐式类型=>语句块
(int x) => x * 5 //单参数,显式类型=>表达式
(int x) => { return x * 5; } //单参数,显式类型=>语句块
() => Console.WriteLine() //无参数
如下所示:
bs.fundelegate = (int i)=> {//Lambda
print("i am lambda "+i);
};
bs.fundelegate += delegate (int i)//匿名函数1
{
print("i am delegate() "+i);
};
bs.fundelegate += delegate//匿名函数2
{
print("i am delegate ");
};