委托的最佳科普解释

转:http://www.cnblogs.com/liulun/archive/2013/02/26/2909985.html

委托

delegate Boolean moreOrlessDelgate(int item);
        class Program
        {
            static void Main(string[] args)
            {
                var arr = new List<int>() { 1, 2, 3, 4, 5, 6,7,8 };
                var d1 = new moreOrlessDelgate(More);
                Print(arr, d1);
                Console.WriteLine("OK");

                var d2 = new moreOrlessDelgate(Less);
                Print(arr, d2);
                Console.WriteLine("OK");
                Console.ReadKey();

            }
            static void Print(List<int> arr,moreOrlessDelgate dl)
            {
                foreach (var item in arr)
                {
                    if (dl(item))
                    {
                        Console.WriteLine(item);
                    }
                }
            }
            static bool More(int item)
            {
                if (item > 3)
                {
                    return true;
                }
                return false;
            }
            static bool Less(int item)
            {
                if (item < 3)
                {
                    return true;
                }
                return false;
            }
        }

这段代码中

      <1>首先定义了一个委托类型

        delegate Boolean moreOrlessDelgate(int item);

        你看到了,委托和类是一个级别的,确实是这样:委托是一种类型

        和class标志的类型不一样,这种类型代表某一类方法。

        这一句代码的意思是:moreOrlessDelgate这个类型代表返回值为布尔类型,输入参数为整形的方法

      <2>有类型就会有类型的实例  

        var d1 = new moreOrlessDelgate(More);     
        var d2 = new moreOrlessDelgate(Less);

        这两句就是创建moreOrlessDelgate类型实例的代码,

        它们的输入参数是两个方法

      <3>有了类型的实例,就会有操作实例的代码   

        Print(arr, d1);
        Print(arr, d2);

        我们把前面两个实例传递给了Print方法

        这个方法的第二个参数就是moreOrlessDelgate类型的

        在Print方法内用如下代码,调用委托类型实例所指向的方法

        dl(item)

泛型委托

    (1)源起

      委托需要定义delgate类型

      使用起来颇多不便

      而且委托本就代表某一类方法

      开发人员经常使用的委托基本可以归为三类,

      哪三类呢?

      请看下面:

    (2)使用

      <1>Predicate泛型委托

        把上面例子中d1和d2赋值的两行代码改为如下:    

              //var d1 = new moreOrlessDelgate(More);
              var d1 = new Predicate<int>(More);
              //var d2 = new moreOrlessDelgate(Less);
              var d2 = new Predicate<int>(Less);

        把Print方法的方法签名改为如下:    

            //static void Print(List<int> arr, moreOrlessDelgate<int> dl)
            static void Print(List<int> arr, Predicate<int> dl)

        然后再运行方法,控制台输出的结果和原来的结果是一模一样的。

        那么Predicate到底是什么呢?

        来看看他的定义:    

          // 摘要:
          //     表示定义一组条件并确定指定对象是否符合这些条件的方法。
          //
          // 参数:
          //   obj:
          //     要按照由此委托表示的方法中定义的条件进行比较的对象。
          //
          // 类型参数:
          //   T:
          //     要比较的对象的类型。
          //
          // 返回结果:
          //     如果 obj 符合由此委托表示的方法中定义的条件,则为 true;否则为 false。
          public delegate bool Predicate<in T>(T obj);

        看到这个定义,我们大致明白了。

        .net为我们定义了一个委托,

        这个委托表示的方法需要传入一个T类型的参数,并且需要返回一个bool类型的返回值

        有了它,我们就不用再定义moreOrlessDelgate委托了,

        而且,我们定义的moreOrlessDelgate只能搞int类型的参数,

        Predicate却不一样,它可以搞任意类型的参数

        但它规定的还是太死了,它必须有一个返回值,而且必须是布尔类型的,同时,它必须有一个输入参数

        除了Predicate泛型委托,.net还为我们定义了Action和Func两个泛型委托

      <2>Action泛型委托

        Action泛型委托限制的就不那么死了,

        他代表了一类方法:

        可以有0个到16个输入参数,

        输入参数的类型是不确定的,

        但不能有返回值,

        来看个例子:      

              var d3 = new Action(noParamNoReturnAction);
              var d4 = new Action<int, string>(twoParamNoReturnAction);

        注意:尖括号中int和string为方法的输入参数

            static void noParamNoReturnAction()
            {
                //do what you want
            }
            static void twoParamNoReturnAction(int a, string b)
            {
                //do what you want
            }

      <3>Func泛型委托

        为了弥补Action泛型委托,不能返回值的不足

        .net提供了Func泛型委托,

        相同的是它也是最多0到16个输入参数,参数类型由使用者确定

        不同的是它规定要有一个返回值,返回值的类型也由使用者确定

        如下示例:      

          var d5 = new Func<int, string>(oneParamOneReturnFunc);

        注意:string类型(最后一个泛型类型)是方法的返回值类型

            static string oneParamOneReturnFunc(int a)
            {
                //do what you want
                return string.Empty;
            }

  

时间: 2024-08-06 20:04:25

委托的最佳科普解释的相关文章

算法解释

1.请解释算法是什么? 答:算法是一个定义良好的计算过程,它将一些值作为输入并产生相应的输出值.简单来说,它是将输入转换为输出的一系列计算步骤. 2.解释什么是快速排序算法? 答:快速排序算法能够快速排序列表或查询.它基于分割交换排序的原则,这种类型的算法占用空间较小,它将待排序列表分为三个主要部分:小于pivot的元素,枢轴元素pivot(选定的比较值),大于pivot的元素. 3.解释算法的时间复杂度? 答:算法的时间复杂度表示程序运行完成所需的总时间,它通常用大O表示法来表示 4.请问用于

理解js事件冒泡事件委托事件捕获

js事件冒泡 javascript的事件传播过程中,当事件在一个元素上出发之后,事件会逐级传播给先辈元素,直到document为止,有的浏览器可能到window为止,这就是事件冒泡现象. <div id="col">    <p>        <a id="btn" href="#">button</a>    </p></div> <script> let b

QT 模型/视图 编程 委托篇

委托类 概述 与模型-视图-控制器模式不同,模型/视图设计不包括用于管理与用户交互的完全独立的组件.通常,视图负责向用户表示模型数据,并处理用户输入.为了在获取输入的方式上允许一定的灵活性,交互由委托执行.这些组件提供输入功能,并负责在某些视图中呈现各个项.控制委托的标准接口在QAbstractItemDelegate类中定义. 委托应该能够通过实现paint()和sizeHint()函数来呈现它们自己的内容.然而,简单的基于widget的委托可以子类化QItemDelegate而不是QAbst

贝叶斯方法

学习资料:http://mindhacks.cn/2008/09/21/the-magical-bayesian-method/ 概率论只不过是把常识用数学公式表达了出来. ——拉普拉斯 记得读本科的时候,最喜欢到城里的计算机书店里面去闲逛,一逛就是好几个小时:有一次,在书店看到一本书,名叫贝叶斯方法.当时数学系的课程还没有学到概率统计.我心想,一个方法能够专门写出一本书来,肯定很牛逼.后来,我发现当初的那个朴素归纳推理成立了——这果然是个牛逼的方法. ——题记 目录 0. 前言 1. 历史  

数学之美番外篇:平凡而又神奇的贝叶斯方法

转载自:http://mindhacks.cn/2008/09/21/the-magical-bayesian-method/ 概率论只不过是把常识用数学公式表达了出来. ——拉普拉斯 记得读本科的时候,最喜欢到城里的计算机书店里面去闲逛,一逛就是好几个小时:有一次,在书店看到一本书,名叫贝叶斯方法.当时数学系的课程还没有学到概率统计.我心想,一个方法能够专门写出一本书来,肯定很牛逼.后来,我发现当初的那个朴素归纳推理成立了——这果然是个牛逼的方法. ——题记 目录 0. 前言 1. 历史   

【转载】数学之美番外篇:平凡而又神奇的贝叶斯方法

数学之美番外篇:平凡而又神奇的贝叶斯方法 BY 刘未鹏 – SEPTEMBER 21, 2008POSTED IN: 数学, 机器学习与人工智能, 计算机科学 概率论只不过是把常识用数学公式表达了出来. ——拉普拉斯 记得读本科的时候,最喜欢到城里的计算机书店里面去闲逛,一逛就是好几个小时:有一次,在书店看到一本书,名叫贝叶斯方法.当时数学系的课程还没有学到概率统计.我心想,一个方法能够专门写出一本书来,肯定很牛逼.后来,我发现当初的那个朴素归纳推理成立了——这果然是个牛逼的方法. ——题记 目

模式识别之中文分词

概率论只不过是把常识用数学公式表达了出来. ——拉普拉斯 记得读本科的时候,最喜欢到城里的计算机书店里面去闲逛,一逛就是好几个小时:有一次,在书店看到一本书,名叫贝叶斯方法.当时数学系的课程还没有学到概率统计.我心想,一个方法能够专门写出一本书来,肯定很牛逼.后来,我发现当初的那个朴素归纳推理成立了——这果然是个牛逼的方法. ——题记 0. 前言 这是一篇关于贝叶斯方法的科普文,我会尽量少用公式,多用平白的语言叙述,多举实际例子.更严格的公式和计算我会在相应的地方注明参考资料.贝叶斯方法被证明是

200道历年逻辑推理真题详解

200道历年逻辑推理真题详解 01.粮食可以在收割前在期货市场进行交易.如果预测谷物产量不足,谷物期货价格就会上升:如果预测谷物丰收,谷物期货价格就会下降.今天早上,气象学家们预测从明天开始谷物产区里会有非常需要的降雨.因为充分的潮湿对目前谷物的存活非常重要,所以今天的谷物期货价格会大幅下降. 下面哪个,如果正确,最严重地削弱了以上的观点? A.在关键的授粉阶段没有接受足够潮湿的谷物不会取得丰收. B.本季度谷物期货价格的波动比上季度更加剧烈. C.气象学家们预测的明天的降雨估计很可能会延伸到谷

深夜聊聊Bufferbloat以及TCP BBR

这篇文章的写作动机来源于知乎上的一个问题,有人问既然Bufferbloat是个问题,为什么路由器的缓存还要设计那么大.起初,我也是觉得缓存越大越好,这个就像人们拼命比拼谁的电脑内存大一样,因为在一般人眼里,内存越大就越快!然而对于网络而言,恰好相反,内存越大,越让人不想归家.        酒店舒适,但只是路过,没人会把家装修成酒店的样子,家才是越大越好.        路由器设计成携带大缓存的设备,这是一个错误!路由器不该有那么大的缓存,然而TCP大牛当年的一个"AIMD错误决定"让