使用委托来做一些事情,大致思路是:

1、定义声明一个委托,规定输入参数和输出类型。
2、写几个符合委托定义的方法。
3、把方法列表赋值给委托
4、执行委托

    internal delegate int MyDelegate();

    class Program
    {
        static void Main(string[] args)
        {
            MyDelegate d = ReturnOne;
            d += ReturnTwo;
            foreach (int i in GetAllReturnVals(d))
            {
                Console.WriteLine(i);
            }
            Console.ReadKey();
        }

        static IEnumerable<int> GetAllReturnVals(MyDelegate myDelegate)
        {
            foreach (MyDelegate del in myDelegate.GetInvocationList())
            {
                yield return del();
            }
        }

        static int ReturnOne()
        {
            return 1;
        }

        static int ReturnTwo()
        {
            return 2;
        }
    }

以上,委托的返回类型是int,如果让返回类型是泛型呢?只要让以上的GetAllReturnVals方法针对泛型就可以了。

   internal delegate T MyDelegate<T>();

    class Program
    {
        static void Main(string[] args)
        {
            MyDelegate<int> d = ReturnOne;
            d += ReturnTwo;
            foreach (int i in GetAllReturnVals(d))
            {
                Console.WriteLine(i);
            }

            MyDelegate<string> d1 = ReturnA;
            d1 += ReturnB;
            foreach (string s in GetAllReturnVals(d1))
            {
                Console.WriteLine(s);
            }
            Console.ReadKey();
        }

        //返回所有委托方法的执行结果
        static IEnumerable<T> GetAllReturnVals<T>(MyDelegate<T> myDelegate)
        {
            foreach (MyDelegate<T> del in myDelegate.GetInvocationList())
            {
                yield return del();
            }
        }

        static int ReturnOne()
        {
            return 1;
        }

        static int ReturnTwo()
        {
            return 2;
        }

        static string ReturnA()
        {
            return "A";
        }

        static string ReturnB()
        {
            return "B";
        }
    }


不过,.NET还为我们准备了一个更"懒 "的方法,那就是针对泛型的委托Func<T>,这下,连委托都不要事先声明了。Func<T>的<>中的泛型列表的最后一个是返回类型,其它的都是输入类型,Func<T>多达十几个重载。

   class Program
    {
        static void Main(string[] args)
        {
            Func<int> d = ReturnOne;
            d += ReturnTwo;
            foreach (int i in GetAllReturnVals(d))
            {
                Console.WriteLine(i);
            }

            Func<string> d1 = ReturnA;
            d1 += ReturnB;
            foreach (string s in GetAllReturnVals(d1))
            {
                Console.WriteLine(s);
            }
            Console.ReadKey();
        }

        //返回所有委托方法的执行结果
        static IEnumerable<T> GetAllReturnVals<T>(Func<T> myDelegate)
        {
            foreach (Func<T> del in myDelegate.GetInvocationList())
            {
                yield return del();
            }
        }

        static int ReturnOne()
        {
            return 1;
        }

        static int ReturnTwo()
        {
            return 2;
        }

        static string ReturnA()
        {
            return "A";
        }

        static string ReturnB()
        {
            return "B";
        }
    }


以上泛型委托Func<T>同时有输入参数和返回类型,如果返回类型为void,那就可以使用Action<T>了,当然Action<T>也有多达十几个重载。

   class Program
    {
        static void Main(string[] args)
        {

            Action<int> a1 = ReturnInt;
            a1(1);

            Action<string> a2 = ReturnStr;
            a2("hello");

            Console.ReadKey();
        }

        static void ReturnStr(string s)
        {
            Console.WriteLine(s);
        }

        static void ReturnInt(int a)
        {
            Console.WriteLine(a);
        }


    }


总结:Func<T>和Action<T>是泛型委托的"语法糖",如果返回类型为void,那就使用Action<T>,否则使用Func<T>。

委托, 泛型委托,Func<T>和Action<T>的更多相关文章

  1. 【C#复习总结】细说泛型委托

    1 前言 本系列会将[委托] [匿名方法][Lambda表达式] [泛型委托] [表达式树] [事件]等基础知识总结一下.(本人小白一枚,有错误的地方希望大佬指正) 系类1:细说委托 系类2:细说匿名 ...

  2. C#编程(三十)----------泛型结构,泛型方法,泛型委托

    泛型结构 泛型结构和泛型类几乎是一直的,只是泛型结构没有继承的特性..NET平台提供的一个泛型结构是(可空类型)Nullablle<T>.可空类型的引入,主要是为了解决数据库语言中的数字与 ...

  3. Func<T>与Action<T>委托泛型介绍:转

    .Net 3.5之后,微软推出了Func<T>与Action<T>泛型委托.进一步简化了委托的定义. Action<T>委托主要的表现形式如下: public de ...

  4. Func<T>与Action<T>委托泛型介绍

    .Net 3.5之后,微软推出了Func<T>与Action<T>泛型委托.进一步简化了委托的定义. Action<T>委托主要的表现形式如下: public de ...

  5. 泛型委托 Predicate/Func/Action

    Predicate 泛型委托  表示定义一组条件并确定指定对象是否符合这些条件的方法.此委托由 Array 和 List 类的几种方法使用,用于在集合中搜索元素.看看下面它的定义: // Summar ...

  6. C#的泛型委托Predicate/Func/Action(转)

    Predicate 泛型委托:表示定义一组条件并确定指定对象是否符合这些条件的方法.此委托由 Array 和 List 类的几种方法使用,用于在集合中搜索元素. 类型参数介绍:    T: 要比较的对 ...

  7. .NET中的Action及Func泛型委托

    委托,在C#编程中占有极其重要的地位,委托可以将函数封装到委托对象中,并且多个委托可以合并为一个委托,委托对象则可以像普通对象一样被存储.传递,之后在任何时刻进行调用,因此,C#中函数回调机制的实现基 ...

  8. (C#) Action, Func, Predicate 等泛型委托

    (转载网络文章) (1). delegate delegate我们常用到的一种声明   Delegate至少0个参数,至多32个参数,可以无返回值,也可以指定返回值类型.   例:public del ...

  9. 使用.NET中的Action及Func泛型委托

          委托,在C#编程中占有极其重要的地位,委托可以将函数封装到委托对象中,并且多个委托可以合并为一个委托,委托对象则可以像普通对象一样被存储.传递,之后在任何时刻进行调用,因此,C#中函数回调 ...

随机推荐

  1. 环形缓冲区-模仿linux kfifo【转】

    转自:https://blog.csdn.net/vertor11/article/details/53741681 struct kfifo{ uint8_t *buffer; uint32_t i ...

  2. LR开发接口脚本

    char token_id,tenant_id;    web_add_header("Accept","application/json");    web_ ...

  3. 定制自己的new和delete:operator new 和 operator delete

    new和delete不同用法 基本用法 int * aptr = new int(10); delete aptr, aptr = nullptr; 上面的代码是我们最基本也是最常见的使用new和de ...

  4. JS实现集合和ECMA6集合

    集合类似于数组,但是集合中的元素是唯一的,没有重复值的.就像你学高中数学的概念一样,集合还可以做很多比如,并集,交集,差集的计算.在ECMA6之前,JavaScript没有提供原生的Set类,所以只能 ...

  5. spark streaming的容错:防止数据丢失

    官方这么说的 [Since Spark 1.2] Configuring write ahead logs - Since Spark 1.2, we have introduced write ah ...

  6. Windows下使用 Sublime Text + MinGW 搭建C/C++开发环境

    下载并安装 Sublime Text 点击此处从官网下载适合自己的Windows系统的Sublime Text 下载好后双击进行安装(一路next就好啦) 下载 MinGW 点击此处下载MinGW 下 ...

  7. 高能天气——团队Scrum冲刺阶段-Day 3

    高能天气--团队Scrum冲刺阶段-Day 3 今日完成任务 于欣月:完成天气预报部分收尾工作 余坤澎:进行特别关心的实现 康皓越:实现闹钟部分添加音乐 范雯琪:初步开始界面优化,寻找天气预报部分的背 ...

  8. Codeforces-1084C

    title: Codeforces-1084C date: 2018-12-13 16:02:04 tags: acm 刷题 categories: Codeforces 概述 好久没写博客了,,,最 ...

  9. JAVAEE——SpringBoot日志篇:日志框架SLF4j、日志配置、日志使用、切换日志框架

    Spring Boot 日志篇 1.日志框架(故事引入) 小张:开发一个大型系统: ​ 1.System.out.println(""):将关键数据打印在控制台:去掉?写在一个文件 ...

  10. bugku web题INSERT INTO注入

    0x01: 打开题目描述,已经将源码给了我们: <?php error_reporting(0); function getIp(){ $ip = ''; if(isset($_SERVER[' ...