.NET (一)委托第一讲:什么是委托

1.为什么要使用委托?

生活中的委托就是委托他人帮我们去办一件事情,程序中的委托类似。看下面的例子

    class Class1
    {
        static void Main(String[] args)
        {
            List<int> list = new List<int>();
            list.Add(1);
            list.Add(2);
            list.Add(3);
            list.Add(4);
            list.Add(5);

            //过滤偶数
            Even(list);

            ObjectDumper.Write(list);
        }

        //过滤集合中的偶数
        public static void Even(List<int> list)
        {
            for (int i = 0; i < list.Count; i++)
            {
                if (list[i] % 2 != 0)
                {
                    list.RemoveAt(i);
                    i--;
                }
            }
        }

        //过滤集合中的奇数
        public static void Odd(List<int> list)
        {
            for (int i = 0; i < list.Count; i++)
            {
                if (list[i] % 2 == 0)
                {
                    list.RemoveAt(i);
                    i--;
                }
            }
        }
    }

通过上面的例子我们发现 Even()方法 和 Odd()方法只有一行代码不同,使用委托可以将方法当成参数传递,这样做的好处是使程序之间的耦合降低,同时节省代码。

改造上面的代码如下:

   class Class2
    {
        //声明委托
        public delegate bool Cal(int num);
        static void Main(String[] args)
        {
            List<int> list = new List<int>();
            list.Add(1);
            list.Add(2);
            list.Add(3);
            list.Add(4);
            list.Add(5);

            //过滤偶数
            Cal cal = new Cal(Even);
            MyCal(list, cal);

            ObjectDumper.Write(list);
        }

        public static bool Even(int num)
        {
            if (num % 2 == 0)
            {
                return true;
            }
            return false;
        }
        public static bool Odd(int num)
        {
            if (num % 2 != 0)
            {
                return true;
            }
            return false;
        }

        public static void MyCal(List<int> list,Cal cal)
        {
            for (int i = 0; i < list.Count; i++)
            {
                if (cal(list[i]))
                {
                    list.RemoveAt(i);
                    i--;
                }
            }
        }

    }

委托描述的是方法的签名(包括参数类型、个数、返回值),上面声明一个委托 Cal ,和 我们要调用的方法一样,接收一个 int类型的参数,返回bool类型。

public delegate bool Cal(int num);

使用New关键字创建委托:

Cal cal = new Cal(Even);

最后调用cal,得到所有偶数项的集合

MyCal(list, cal);

我们在 MyCal(List<int> list,Cal cal) 方法中,传递了一个委托 作为参数,Cal描述的是 Even 或者Odd方法的签名,这样可以在调用的时候决定 是过滤奇数 还是 过滤偶数。

这和我们直接调用Even或Odd方法有什么不同,不是更麻烦了吗,接着往下看:

我们可以将过滤的方法改成如下代码:

MyCal(list, delegate(int i)
            {
                if (i % 2 == 0)
                {
                    return true;
                }
                return false;
            });

正因为MyCal方法接收的是一个委托,所以我们可以在不定义Even或Odd的时候,使用匿名委托。

这样省去了不必要的代码,使结构看起来更简单,也不需要预先定义好方法,在调用的时候我们临时决定。

.NET 还给我们提供了更进一步的简化,使用Lambda表达式:

//代码演进
//lamada
MyCal(list, (i) => { return i % 2 == 0 ? true : false; });

i表示输入参数 (i) => { return i % 2 == 0 ? true : false; } 是一条lambda语句,标识过滤偶数。

完整的代码如下:

//声明委托
        public delegate bool Cal(int num);
        static void Main(String[] args)
        {
            List<int> list = new List<int>();
            list.Add(1);
            list.Add(2);
            list.Add(3);
            list.Add(4);
            list.Add(5);

            MyCal(list, (i) => { return i % 2 == 0 ? true : false; });

            ObjectDumper.Write(list);
        }

        public static void MyCal(List<int> list, Cal cal)
        {
            for (int i = 0; i < list.Count; i++)
            {
                if (cal(list[i]))
                {
                    list.RemoveAt(i);
                    i--;
                }
            }
        }

这样做是不是比开始的时候简单多了,无论后面再怎么添加新的过滤方式,我们只需要修改我们的lambda语句,其他的都不需要变动,这就是委托的魅力。

时间: 2024-08-07 03:20:53

.NET (一)委托第一讲:什么是委托的相关文章

自定义委托类型 - .Net自带委托类型

委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递. 与其他的类不同,委托类具有一个签名,并且它只能对与其签名匹配的方法进行引用. 一.自定义委托类型 1.语法结构:访问修饰符 delegate 返回类型 委托类型名称(参数列表); 例如: // 声明一个委托类型,两个参数均为int类型,返回值为int类型 public delegate int Calc(int a, int b);自定义的委托可以不带参数,也可以没有返回值. 接下来我们看一个例子怎么使用委托 1.

html学习第一讲(内容html常规控件的的使用)

1 <html> 2 <head> 3 <title> 这是网页的标题</title> 4 </head> 5 6 <body> 7 <h2><font color ="blue"> 这是网页的内容!</font></h2> 8 9 <a href="http://www.cnblogs.com/gongxijun">这是一个连接<

C# 委托链、多路广播委托

委托链.多路广播委托:也就是把多个委托链接在一起,我们把链接了多个方法的委托称为委托链或多路广播委托 例: 1 class HelloWorld 2 { 3 //定义委托类型 4 delegate void DelegationChain(); 5 static void Main(string[] args) 6 { 7 //用静态方法来实例委托 8 DelegationChain mydelegateone=new DelegationChain(HelloWorld.Fun2); 9 //

《上古天真论》第一讲文字版

上古天真论篇第一讲主讲:徐文兵  主持:梁  冬播出时间:2008-12-06  23:00—24:00  经文:昔在黄帝,生而神靈,弱而能言,幼而徇齐,长而敦敏,成而等天.乃问于天师曰:余闻上古之人,春秋皆度百岁,而动作不衰:今时之人,年半百而动作皆衰者,时世异耶?人将失之耶?岐伯对曰:上古之人,其知道者,法于阴阳,和于术数, 梁冬:我是梁冬.梁某人.而做在我对面的是我的在求学中医方面的偶像级的老师徐文兵老师,徐老师你好!徐文兵:梁冬好!听众朋友们大家好!梁冬:啊呀,一看就很有这个电台风范,从

《大话数据结构》 第一讲.数据结构绪论 (读书笔记)

大话数据结构 导读笔记 第一讲: 一.基本概念和术语 (1)数据元素:是组成数据的.有一定意义的基本单位,在计算机中通常作为整体处理.也被称为记录.   比如,在人类中,什么是数据元素呀?当然是人了. (2)数据项:一个数据元素可以由若干个数据项组成.   比如人这样的数据元素,可以有眼.耳.鼻.嘴.手.脚这些数据项,也可以有姓名.年龄.性别.出生地址.联系电话等数据项,具体有哪些数据项,要视你做的系统来决定. 数据项是数据不可分割的最小单位.在数据结构这门课程中,我们把数据项定义为最小单位,是

原创PHP编程第一讲《十五天学会PHP》林伟帆教学视频

我自己录制的原创php编程教学视频第一讲<十五天学会php>,为了帮助大家的学习,引领大家进入互联网动态时期,谢谢大家的观看.原创php编程教学视频<十五天学会php>第一讲EXE高清视频格式下载地址1: http://pan.baidu.com/s/1dDxVFOH 下载地址2: http://pan.baidu.com/s/1gdvj9KZWMV视频格式下载地址:http://pan.baidu.com/s/1sjBe05f我会不定期更新哦,现在是第一讲助人为快乐之本,本人自己

(转)【风宇冲】Unity3D教程宝典之AssetBundles:第一讲

自:http://blog.sina.com.cn/s/blog_471132920101gz8z.html 原创文章如需转载请注明:转载自风宇冲Unity3D教程学院 AssetBundles第一讲:基本使用 AssetBundles是从unity导出你选择的assets,它使用特有的压缩格式并且应用可以实时去读取它.包括模型贴图音频等任何asset类型,甚至整个场景.压缩大小基本能达到zip的效果.AssetBundles从设计时就定位为可以很简单就下载到应用里.如果你想包括自定义的bina

第一讲:Android开发环境的搭建

一.Android简介 Android 是基于Linux内核的软件平台和操作系统.Android构架主要由3部分组成,linux内核层,类库.虚拟机和核心组件库层,应用程序框架层Android应用程序使用JAVA语言进行开发. 二.开发环境的搭建 软件的准备:JAVA  JDK 1.6Eclipse 3.6           (eclipse-java-helios-win32.zip)ADT 0.9.7             (Android Development Tools)SDK T

斯坦福大学深度学习与自然语言处理第一讲:引言

斯坦福大学在三月份开设了一门"深度学习与自然语言处理"的课程:CS224d: Deep Learning for Natural Language Processing ,授课老师是青年才俊Richard Socher,他本人是德国人,大学期间涉足自然语言处理,在德国读研时又专攻计算机视觉,之后在斯坦福大学攻读博士学位,拜师NLP领域的巨牛 Chris Manning和Deep Learning 领域的巨牛 Andrew Ng ,其博士论文是< Recursive Deep Le