C#委托和事件

委托

委托是一种数据类型(引用)

委托看成是存储方法的容器

委托的自身的类型决定了存储方法的类型

格式:访问权限修饰符 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类似,但是它有返回值,其箭头括号内的最后一个参数就是返回值

如果有多个返回值,则最后保留的是最后注册函数的返回值

上一篇
下一篇