1、为什么要使用委托

  将一个方法作为参数传递给另一个方法

2、委托概念

  public delegate int 委托名(int a, int b);

  声明一个委托类型,可以用访问修饰符修饰,delegate关键字,有返回值和参数

  委托所指向的函数必须跟委托具有相同的签名,即相同的参数个数,相同的参数类型和相同的返回值类型

3、匿名函数

  没有名字的函数                         );

static void Calculate(Expression ex, int a, int b)
        {
            Console.WriteLine(ex(a, b) + "\n");
        }

4、泛型委托

  public delegate T 委托名<T>(T a, T b);

  微软已定义好一套泛型委托供我们使用,以免繁琐重复定义,它们分别是Action,Func和Predicate

  1). Action

    Action是无返回值的泛型委托

    Action表示无参,无返回值的委托

    Action<int,string> 表示有传入参数int,string无返回值的委托

    Action<int,string,bool> 表示有传入参数int,string,bool无返回值的委托

  Action<int,int,int,int> 表示有传入4个int型参数,无返回值的委托

      Action至少0个参数,至多16个参数,无返回值。

  2). Func

    Func是有返回值的泛型委托

      Func<int> 表示无参,返回值为int的委托

      Func<object,string,int> 表示传入参数为object, string 返回值为int的委托

      Func<T1,T2,,T3,int> 表示传入参数为T1,T2,,T3(泛型)返回值为int的委托

      Func至少0个参数,至多16个参数,根据返回值泛型返回。必须有返回值,不可void

  3). Predicate

      Predicate 是返回bool型的泛型委托

   Predicate<int> 表示传入参数为int 返回bool的委托

     Predicate有且只有一个参数,返回值固定为bool

5、多播委托

  包含一个以上方法的引用,可以顺序执行多个方法

  包含的方法必须返回void,否则会抛出异常,之后所有的委托都不会执行

  可以使用GetInvocationList调用与委托直接相关的方法,捕获异常,并继续下一次迭代

   

  class Program
    {
        delegate void show(out int a);
        static void Main(string[] args)
        {
            int d;
            show s = show1;
            s += show2;
            s += show3;
            s += show4;
            Delegate[] list = s.GetInvocationList();
            foreach (show ds in list)
            {
                try
                {
                    ds(out d);
                }
                catch
                {
                    Console.WriteLine("show2异常");
                }
            }
            Console.Read();
        }
        static void show1(out int a)
        {
            a=1;
            Console.WriteLine(a);
        }
        static void show2(out int a)
        {
            a = 2;
            Console.WriteLine(a);
        }
        static void show3(out int a)
        {
            a = 3;
            Console.WriteLine(a);
        }
        static void show4(out int a)
        {
            a = 4;
            Console.WriteLine(a);
        }
    }

6、lamda表达式

  本质还是匿名函数(参数=>返回条件)

7、事件

  http://www.cnblogs.com/ruanraun/p/shijian.html

委托、泛型委托、多播委托、匿名函数、lamda表达式、事件的更多相关文章

  1. (28)C#委托,匿名函数,lambda表达式,事件

    一.委托 委托是一种用于封装命名和匿名方法的引用类型. 把方法当参数,传给另一个方法(这么说好理解,但实际上方法不能当参数,传入的是委托类型),委托是一种引用类型,委托里包含很多方法的引用 创建的方法 ...

  2. Net中委托之二多播委托

    本篇主要讲解多播委托 1.多播委托的实例 public class MyDelegate { private delegate int NoParameterWithReturn();//1.声明委托 ...

  3. c#中匿名函数lamb表达式

    c#中匿名函数lamb表达式 实例一:(其实,这样都是些语法糖) using System; using System.Collections.Generic; using System.Linq; ...

  4. 【Unity|C#】基础篇(9)——匿名函数 / Lambda表达式

    [学习资料] <C#图解教程>(第13章):https://www.cnblogs.com/moonache/p/7687551.html 电子书下载:https://pan.baidu. ...

  5. 委托-异步调用-泛型委托-匿名方法-Lambda表达式-事件【转】

    1. 委托 From: http://www.cnblogs.com/daxnet/archive/2008/11/08/1687014.html 类是对象的抽象,而委托则可以看成是函数的抽象.一个委 ...

  6. 委托Delegate,多播委托和委托链

    定义一个委托 public delegate void CalculateDelegate(int 32 x,int 32 y); 定义一个委托类型的变量 public static Calculat ...

  7. C# 委托链(多播委托)

    委托既可以封装一个方法,又可以对同一类型的方法进行封装,它就是多播委托 using System; using System.Collections.Generic; using System.Lin ...

  8. python 中的匿名函数lamda和functools模块

    为什么 要把匿名函数和functools模块写在一起? 因为 lamda函数和functools模块都是对函数一种增强或者是简化. 匿名函数: 为了解决那些功能很简单的需求而设计一次性的需求函数 #& ...

  9. Qt中使用匿名函数lambda表达式

    一.为什么要使用匿名函数lamdba 首先,lambda表达式可以使代码变得简单,C++中,一个lambda表达式表示一个可调用的代码单元.如代码: #include <QCoreApplica ...

  10. 匿名函数 lambda表达式(lambda expression)

    阅读g2log时,发现有两行代码居然看不懂. 1. auto bg_call =  [this, log_directory]() {return pimpl_->backgroundChang ...

随机推荐

  1. 手写一个类加载器demo

    1.什么是类加载器? 2.加载方式 ClassLoader类加载器,主要的作用是将class文件加载到jvm虚拟机中.jvm启动的时候,并不是一次性加载所有的类,而是根据需要动态去加载类,主要分为隐式 ...

  2. Qt 5 常用类及基本函数

    //主要使用类#include <Qstring> #include <QMenu> #include <QMenuBar> #include <QToolB ...

  3. php curl方法 支持 http https get post cookie

    //请求方式curl封装 @author Geyaru QQ 534208139 参数1:访问的URL,参数2:post数据(不填则为GET),参数3:提交的$cookies,参数4:是否返回$coo ...

  4. Unity3D_(插件)DOTween动画插件

    使用DOTween动画插件来实现物体的移动动画 Learn 一.DOTween插件对变量的动画 二.控制Cube和UI面板的动画 三.动画的快捷播放方式 四.动画的前放和后放 五.From Tween ...

  5. 互联网_http协议

    一.定义 http协议叫做超文本传输协议,是从web服务器传输超文本到本地浏览器的协议. 二.特征 1.无连接:即每次连接仅处理一个请求,服务器处理完客户的请求,并收到客户端的响应后,即断开连接.采用 ...

  6. 02.替换空格 (Java)

    题目描述 请实现一个函数,将一个字符串中的每个空格替换成“%20”.例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy. 思路 感觉这题对于Java意义 ...

  7. 对于Java培训出身的同学,接下来该怎么学习技术?

    首先恭喜从培训班出来找到工作的同学,确实挺不容易的,4个月的培训,每天从早上9点到晚上9点,也是996,主要的活动地方就是宿舍和教室, 让我现在也去培训,我估计还熬不下来. 尤其是对于从小白开始的同学 ...

  8. RocketMQ消息发送流程和高可用设计

    (源码阅读先看主线 再看支线 先点到为止 后面再详细分解) 高可用的设计就是:当producer发送消息到broker上,broker却宕机,那下一次发送如何避免发送到这个broker上,就是采用La ...

  9. python开发环境的搭建,以及pycharm的安装

    先到python 官网下载python. 下载好了之后,直接运行exe文件,进行安装(在安装程序运行后的第一个form上,点击next的时候,在next的左侧有一排文字和一个复选框,那个是添加环境变量 ...

  10. Git 合并两个分支内容

    1,将开发分支代码合入到master中 git checkout dev #切换到dev开发分支 git pull git checkout master git merge dev #合并dev分支 ...