C# delegate event Lambda 匿名函数

本文深入解析了委托与事件的概念及使用方法,阐述了两者之间的区别,并通过实例展示了如何利用委托和事件实现消息通信。此外,还介绍了Lambda表达式与匿名函数的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

委托和事件的区别:
委托是一个类,该类内部维护着一个字段,指向一个方法。事件可以被看作一个委托类型的变量,通过事件注册、取消多个委托或方法。
委托可以在本类或者其他类注册函数,执行函数。
事件可以在本类或者其他类注册函数,但只能在本类中执行函数。事件可以更好的封装逻辑,保证耦合度。
什么时候使用委托,什么时候使用事件呢?
不知道,,,当回调函数只能在本类中执行时,使用事件,这算不算一个?

1,委托:
委托可以在本类或者其他类注册函数,执行函数。
delegate 是一种可用于封装命名方法或匿名方法的引用类型。 委托类似于 C++ 中的函数指针;但是,委托是类型安全和可靠的。
委托的使用:
第一次用的“=”或者“new”,是赋值的语法;
第二次,用的是“+=”,是绑定的语法。
如果第一次就使用“+=”,将出现“使用了未赋值的局部变量”的编译错误。
连续 “=” 则是全部覆盖,执行最后一次“=”的函数。
使用“-=”取消注册,多次“+=”同一个函数会多次执行该函数。
如下:最后只会执行Fun3函数。
 fundelegate = new FunDelegate(Fun);
 fundelegate = Fun;
 fundelegate += Fun2;
 fundelegate = Fun3;
 fundelegate();
以下会执行3次Fun2:
mydele = Fun2;
mydele += Fun2;
mydele += Fun2;

 

2,事件:
事件可以在本类或者其他类注册函数,但只能在本类中执行函数。事件可以更好的封装逻辑,保证耦合度。
事件只能“+=”,“-=”,不能用“=”。
如下:Fun函数会执行2次。
eventFun += Fun;
        eventFun += Fun;
        eventFun();

 

3,使用委托注册事件,完成消息通信:
public class SenderTest : MonoBehaviour
{
    public delegate void FunDelegate();
    public FunDelegate fundelegate;
    public event FunDelegate eventFun;

    private void Start()
    {
        fundelegate();//当某个行为触发时,需要ReceiveTest做出相应的回应
    }
}
//接受者提前注册好对应得事件
public class ReceiveTest : MonoBehaviour
{
    SenderTest bs;
    private void Awake()
    {
        bs = GetComponent<SenderTest>();
        bs.fundelegate = Fun;
    }
    void Fun()
    {
        print(" fun is call ");
    }
}

 

4,Lambda 与 匿名函数
Lambda表达式是一种可用于创建委托的匿名函数。
所有Lambda表达式都使用Lambda运算符=>,Lambda运算符的左边是输入参数(如果有),右边是表达式或语句块。
Lambda表达式可以有多个参数、一个参数,或者没有参数。其参数类型可以隐式或者显式。
示例代码如下:
(x, y) => x * y         //多参数,隐式类型=> 表达式  
x => x * 5              //单参数, 隐式类型=>表达式  
x => { return x * 5; }      //单参数,隐式类型=>语句块  
(int x) => x * 5            //单参数,显式类型=>表达式  
(int x) => { return x * 5; }      //单参数,显式类型=>语句块  
() => Console.WriteLine()   //无参数

如下所示:
bs.fundelegate = (int i)=> {//Lambda
            print("i am lambda "+i);
        };
bs.fundelegate += delegate (int i)//匿名函数1
        {
            print("i am delegate() "+i);
        };
bs.fundelegate += delegate//匿名函数2
        {
            print("i am delegate ");
        };
 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值