C#委托和事件的区别

一、概念
1、委托:将方法以变量的形式传递,并且以方法的形式执行。他是类,是引用类型。
2、事件:功能被限制的一个委托变量。它的类型是委托类型。
3、委托的三种形式
3.1、delegate: 四步(声明,实例化,注册方法,调用)
3.2、Action:添加的方法不能有返回值
3.3、Func: 添加的方法要有返回值
3.4、lamda表达式:方法只使用一次,没有多次使用的话使用

二、案例
1、委托、匿名函数、lamda表达式、事件测试
public class DelegateAndEventTest : MonoBehaviour
{
//声明 带一个参数并且无返回值的委托
public delegate void TestDlg(string content);
//TestDlg 类型的事件
public event TestDlg TestDlgEvent;

// Start is called before the first frame update
void Start()
{
    //委托的解释:将方法以变量的形式传递,并且以方法的形式执行
    TestDlg dlg = TestDlg01;
    dlg += TestDlg02;//委托链
    dlg -= TestDlg02;
    dlg("测试");

    //匿名函数:方法只使用一次,没有多次使用的话使用匿名函数
    TestDlg dlg1 = delegate (string name) 
    {
        Debug.Log(name+"这是匿名函数");
    };
    dlg1("测试");

    //lamda表达式
    TestDlg dlg2 = (name) =>
    {
        Debug.Log(name+"这是lamda表达式");
    };
    dlg2("测试");

    //事件 功能被限制的一个委托变量 它的类型是委托类型
    //通过+=添加通知订阅事件
    //通过-=取消通知订阅事件
    //注册事件
    TestDlgEvent += DelegateAndEventTest_TestDlgEvent;
    //SayHelloEvent -= DelegateAndEventTest_SayHelloEvent;
    if (TestDlgEvent != null)
    {
        TestDlgEvent("测试");//调用事件
    }
}

private void DelegateAndEventTest_TestDlgEvent(string content)
{
    Debug.Log(content + "这是事件");
}

public void TestDlg01(string content)
{
    Debug.Log(content + "这是委托01");
}

public void TestDlg02(string content)
{
    Debug.Log(content + "这是委托02");
}

}

2、Action测试
public class ActionTest : MonoBehaviour
{
private delegate void MyDlg(string s);//声明
MyDlg mydlg;//实例

//使用Action直接把委托的声明给绕过去了,直接实例化一个Action
private Action<string> _actionTest;

void Start()
{
    mydlg += DlgTest;
    mydlg?.Invoke("执行委托");//?的意思就是mydlg不为空执行后面的语句,为空不执行

    _actionTest += DlgTest;
    _actionTest?.Invoke("执行Action");
}

private void DlgTest(string content)
{
    Debug.Log(content);
}

}

3、Func测试
public class FuncTest : MonoBehaviour
{
private Func<string, string, int> _funcSum;

void Start()
{
    //var是隐式类型,根据后面的代码去推断是哪一种类型
    _funcSum += ParseSum;
    var sum= _funcSum?.Invoke("4","5");
    Debug.Log(sum);
}

private int ParseSum(string s1,string s2)
{
    int sum = int.Parse(s1) + int.Parse(s2);
    return sum;
}

}

  • 1
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值