C# delegate event Lambda 匿名函数

委托与事件关系: 委托是一种类型,事件是一种成员。
委托可以在本类或者其他类注册函数,执行函数。
事件可以在本类或者其他类注册函数,但只能在本类中执行函数。事件可以更好的封装逻辑,保证耦合度。

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

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 ");
        };
 

猜你喜欢

转载自blog.csdn.net/tran119/article/details/81365423
今日推荐