• C# 委托和Lambda表达式


    看了一些资料,简要的总结一下委托,Lambda,事件。

     

    委托。

    1)委托的含义

    委托定义了函数类型,是一种类似“C++函数指针”的东西。

    但委托和函数指针还是不同的,函数指针不过是一个函数的入口地址(指向内存位置的指针),它是类型不安全的;委托不仅包含入口地址,还定义了函数的具体信息,如返回值,输入参数等,它是类型安全的。也就是说,定义一个函数指针后,任何函数都可以赋予该指针,有极大的不安全性;但定义了一个委托后,只有符合该委托定义的函数签名的函数才能赋予该委托,增强的安全性。

    总之,在.NET中要传递一个方法,就必须把一个方法的细节(返回值,输入参数)封装在一种新类型的对象中,即委托。所以委托是一种类,如同String定义了字符串对象,委托定义了函数对象。

    在使用委托的时候,就像使用一个类一样。使用类时,分为两个阶段:首先定义这个类,然后实例化类的一个对象。委托的大致使用形式如下:

    void Method(int a)   //假设有这样一个Method
    {
      return a;  
    }
    delegate void DelegateMethod(int x); //这里定义了一个委托,DelegateMethod相当于String
    //将Method函数赋予委托变量myDelegate,类似String myString = new String("abc"),也可以用DelegateMethod myDelegate = Method; 达到同样的效果 DelegateMethod myDelegate = new DelegateMethod(Method); myDelegate(5); //等价于Method(5)

     

    2)委托的多播

    利用“+=”运算符可以让委托包含多个函数,在使用该委托变量时,会依次调用这些函数。

     

    3)Action<T>和Func<T> 委托

    除了使用delegate关键字定义一个新的委托,还可以使用已定义的好的委托。

    泛型Action<T>委托表示一个返回值为void,输入参数为T的函数,若想定义2个输入参数的函数,即为Action<T1, T2>泛型Func<T, TResult>委托表示返回值类型为TResult,输入参数为T的函数,同理若想定义多个输入参数,即为Function<T1, T2, T3, TResult>

     

    4)Lambda表达式(入)

     前面提到可以使用如下方法给委托变量赋值:

    DelegateMethod myDelegate = Method; 

    而Lambda表达式是另一种给委托赋值的方式。类似一种匿名函数的方式,只要有委托参数类型的地方,就可以使用Lambda表达式:

    DelegateMethod myDelegate = a => return a; 

    上面这句话完成之前赋值方式同样的效果(“a = > return a;” 就相当于Method)。其中a是函数中参数,“=>”后面跟的是函数的具体实现

     

    总之,委托实际是定义函数的类型(如同String是定义字符串的类型),它方便我们将一个函数作为另一个函数的参数传递进去。

     

     

    事件。

    事件就是封装了委托类型的变量,就如同在类中封装string类型时用属性,那封装delegate类型时就用事件。而且统统利用“+=/-=”绑定/解绑函数,利用event关键字:

    public event myDelegate makeDelegate;

    事件将原来的委托变量myDelegate封装成一个新的委托变量makeDelegate,它总是private,我们就可以这么干了

    makeDelegate += GetChineseName;
    makeDelegate += GetEnglishName;

    注意都是用的“+=”,这样利用语句:

    makeDelegate("Yis");

    依然会先后调用public void GetChineseName("Yis")和public void GetEnglishName("Yis")两个方法。

     

     先写这么多,以后加深了理解再补充。

     



     

  • 相关阅读:
    django的路由系统
    django配置
    边工作边刷题:70天一遍leetcode: day 2
    边工作边刷题:70天一遍leetcode: day 5
    边工作边刷题:70天一遍leetcode: day 5
    边工作边刷题:70天一遍leetcode: day 5
    边工作边刷题:70天一遍leetcode: day 6
    边工作边刷题:70天一遍leetcode: day 6
    边工作边刷题:70天一遍leetcode: day 6
    边工作边刷题:70天一遍leetcode: day 6
  • 原文地址:https://www.cnblogs.com/yisss/p/3411443.html
Copyright © 2020-2023  润新知