委托 Delegate、Event 区别
Delegate特性
Delegate官方翻译是委托 。delegate 本质上是一个用来存放函数的容器。众所周知,在面向对象的语言中,变量可以是值类型,也可以是引用类型。而 C# 则用 delegate 的机制将函数引用存储起来,并且可以在运行时被改变。delegate 特别用于实现事件和回调方法,一种委托将提前约定好存放的函数的返回类型和参数列表。
delegate 可以被初始化成一个函数的引用,也可以通过 +=,-= 等运算符进行存放多个函数引用。存放多个函数时,调用 delegate 将会调用所有的函数引用,这种行为叫做 multicast delegate,即委托的多播。
=会取消所有订阅,只保留=之后的订阅
//定义一个无返回值的,带一个int参数的委托
public delegate void myDelegate(int num);
// 定义一个委托,并添加订阅
public myDelegate m_delegate;
m_delegate += MyFun;
public void MyFun(int num)
{
Debug.Log("my func: " + num);
}
// 此时 如果再使用 `=` 会取消前面所有的订阅,只保留 `=` 后的新订阅
m_delegate = MyFun1; //MyFun订阅被取消,只有MyFun1在订阅中
Event特性
Event外部调用只能使用+=、-=增减委托,而不能直接使用=,避免出现委托因为误操作(或恶意)取消所有订阅。发布者是可以是用=。
public class A
{
public delegate void ActionTest();
public event ActionTest m_event;
public void T()
{
m_event = MyFun; // 不报错
}
private void MyFun()
{
throw new NotImplementedException();
}
}
public class B
{
public A a;
public void T()
{
a.m_event = MyFun; // 报错
a.m_event += MyFun; // 不报错
a.m_event -= MyFun; // 不报错
}
private void MyFun()
{
throw new NotImplementedException();
}
}
