委托
委托是一种数据类型(引用)
委托看成是存储方法的容器
委托的自身的类型决定了存储方法的类型
格式:访问权限修饰符 delegate 返回值类型 委托名 (参数列表)
定义的位置:可以定义在和其他类平级,在命名控件内部(internal),也可以定义在类中(private)
委托名:帕斯卡命名法
using System; using UnityEngine; namespace DelegateTest { public delegate void MyDelegate1(string name); public class Test2 : MonoBehaviour { private MyDelegate1 _m; private void Start() { _m = TestFunc; _m += TestFunc2; _m -= TestFunc; _m += delegate(string s) { print("匿名函数" + s); }; _m("花蕊"); } private void TestFunc(string name) { print(name); } private void TestFunc2(string name) { print("我是" + name); } } }
事件
现有委托才可以使用事件
// 定义委托 public delegate void MyDelegate(); // 声明委托类型的对象(事件) // 赋值 // 调用
event 修饰委托类型的对象与委托类型的对象的区别
event加完之后,同一类中对委托类型的对象进行操作,没什么区别
不同的类中,如果在其他类中,使用当前的委托对象,只能+= 和 -=, 不能 =
在其他类中不能调用当前事件,必须在当前类中调用
委托和事件的区别
delegate存在着被赋值的风险,比如 delegate1 = delegate2,会导致之前+=的委托会被覆盖
事件本质也是Delegate, 但是赋值的权限设置成了Private
如果写成Event就可以避免覆盖的情况,它只能使用+= 或者 -=,安全性有了提升
Action
Action是Delegate的简写,C#为我们封装好的一种委托写法,所以也存在像委托一样被覆盖的情况
Action最多支持16个参数的模板
Action是没有返回值的
public Action xxxx() public Action<int> xxxx() public Action<bool,int....*16> xxxx()
Function
Function和Action类似,但是它有返回值,其箭头括号内的最后一个参数就是返回值
如果有多个返回值,则最后保留的是最后注册函数的返回值