委托
委托是一种数据类型(引用)
委托看成是存储方法的容器
委托的自身的类型决定了存储方法的类型
格式:访问权限修饰符 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类似,但是它有返回值,其箭头括号内的最后一个参数就是返回值
如果有多个返回值,则最后保留的是最后注册函数的返回值