初入委托

一、什么是委托

  委托,类似于C/C++中的函数指针,而在C#中没有函数指针的概念,但它引入了委托的概念,委托是一个引用类型,也可以将其理解为一种数据类型。也可以更通俗的理解:委托就是在运行时,可以将一个条件(委托参数)通过特殊途径(委托引用)得到一个结果(委托返回结果)。而委托在这里扮演的角色就是找到这个途径。

二、委托声明

  委托声明取决于被委托引用的方法,委托必须与所引用的方法具有相同签名。

三、委托调用

  那么委托到底有什么用?什么时候该用委托呢?先看一段代码~~~

  1.委托调用与函数调用

  

  //定义一个返回值类型为Color 参数类型为TreeType 的委托
 public delegate Color GetColorofTree(TreeType treeType);

 public enum TreeType : uint { Apple, Maple, Ginkgo }

//根据不同果树 返回不同的颜色
        public static Color GetTreeColor(TreeType treeType)
        {
            switch (treeType)
            {
                case TreeType.Apple:
                    return Color.Green;
                case TreeType.Maple:
                    return Color.Red;
                case TreeType.Ginkgo:
                    return Color.Yellow;
                default:
                    return Color.Green;
            }
        }

  我们定义了一个方法,可通过不同的果树得到不同的颜色。下面来使用委托。

 //调用参数为委托类型的方法
static void GetColor(GetColorofTree color)
{
           Color c= color(TreeType.Apple);
           Console.WriteLine("使用委托:{0}",c);
}

static void Main(string[] args)
 {
 /*===========================函数调用委托=====================================*/
             GetColor(GetTreeColor);//使用委托
             Color co = GetTreeColor(TreeType.Apple);//直接调用函数
             Console.WriteLine("不使用委托:{0}",co);
}

  我们新加了一个GetColor的方法,它的参数是以委托GetColorofTree为类型,在这里就是我们通俗的说,委托就是可以把一个函数当作参数传入另外一个函数。

  看看结果:

  通过这个结果可以看到都得到了想要的结果 Green颜色。那么问题来了,既然使用委托和不使用委托的结果都相同,那么为什么要用委托呢,而且用委托还更麻烦,还要新加一个方法,而为什么不用GetTreeColor函数直接调用呢?

  我们可以想想,这里只有一个“途径”——通过传入不同的树来得到不同的颜色,那如果我们要再加新的“途径”,通过传入不同的树得到其树叶的颜色,或其果实成熟果皮的颜色,果肉的颜色等等。。。 那么使用委托的好处就慢慢体现出来了。这么多的“途径”如果我们在运行之前不能确定要用哪个途径,那么我们就可以用委托了。委托的好处就是可以在程序运行时的时候帮你在众多“途径”中帮你找到一个你想要的“途径”。

  2.关于委托的调用

  

 1 /*===========================委托引用方法=====================================*/
 2
 3              GetColorofTree handler = new GetColorofTree(GetTreeColor);
 4              //handler(TreeType.Apple);
 5              handler.Invoke(TreeType.Apple);
 6
 7             /*===========================匿名委托 .net 2.0=====================================*/
 8             GetColorofTree hand = delegate(TreeType type)
 9             {
10                 //委托引用的方法的实现部分
11                 switch (type)
12                 {
13                     case TreeType.Apple:
14                         return Color.Green;
15                     case TreeType.Maple:
16                         return Color.Red;
17                     case TreeType.Ginkgo:
18                         return Color.Yellow;
19                     default:
20                         return Color.Green;
21                 }
22             };
23             hand.Invoke(TreeType.Apple);
24
25             /*===========================lamda表达式 .net 3.0=====================================*/
26
27             Func<TreeType, Color> f = type =>
28             {
29                 switch (type)
30                 {
31                     case TreeType.Apple:
32                         return Color.Green;
33                     case TreeType.Maple:
34                         return Color.Red;
35                     case TreeType.Ginkgo:
36                         return Color.Yellow;
37                     default:
38                         return Color.Green;
39                 }
40             };
41             f(TreeType.Apple);

  上面代码例举了三种委托的调用方式,1、先实例化一个委托,然后使用委托调用,2、匿名委托(匿名方法),3、lamda表达式。若用匿名委托和lamda表达式调用委托,GetTreeColor方法和委托的声明就都不需要了。

=====================================================================================================

以上观点仅为个人理解,如有错误请指正~~~

  

  

时间: 2024-10-28 22:07:34

初入委托的相关文章

初入码田--ASP.NET MVC4 Web应用之创建一个空白的MVC应用程序

初入码田--ASP.NET MVC4 Web应用开发之一  实现简单的登录 初入码田--ASP.NET MVC4 Web应用开发之二 实现简单的增删改查 2016-07-29 再次之前,需要一台电脑(- ̄▽ ̄)-,以及Visual Studio 2013或者更高版本,SQL Sever数据库(暂时不用) 新建项目 下面会出现选择模板选项(我们选择的是MVC模板) 其中,在创建MVC模板时会有身份验证选项.可选择添加的文件夹和核心引用(Web Form和Web API)以及单元测试选项 身份验证分

0x00linux32位汇编初入--前期准备

0x00汇编初入--前期准备 一.汇编工具 在linux平台下常用的编译器为as,连接器为ld,使用的文本编辑器为vim,汇编语法为att 以下是一些工具: addr2line 把地址转换为文件名和行号 ar 创建,修改和展开文件存档 as 汇编器 c++filt 还原c++符号过滤器 gprof 显示程序简档信息 ld 把目标代码文件链接 nlmconv 把目标代码转换为Netware loadable Module格式 nm 列出目标文件中的符号 objcopy 复制和翻译目标文件 objd

初入树莓派1----安装系统+进入SSH

为了更好的从事程序员事业.填坑linux.为学弟打下第一手资料.留下linux培训教材-- -------实际就是为了搭个路由器///玩玩.... 入了树莓派3b +电源+外壳+sd卡---300大洋--------肉疼 树莓派3b的耗电量还是挺大的推荐买个2A以上的电源. ////////////////////////////////////分割线/////////////////////////////////////////// 树莓派系统安装+进入命令行 树莓派支持 数十款操作系统 一

初入&#39;C&#39;,以做一个例题有感。

题目:写一个函数返回参数二进制中 1 的个数 方法1: 我自己写的,运用'%'和'/',感觉挺简单的. int count_one_bit(int num) { unsigned int count=0; while(num) { if(num%2==1) count++; num=num/2; } return count; } int main() { int n = 0; int count = 0; scanf("%d", &n); count = count_one_

初入前端,面对一个项目应注意哪些?

前言: 对于初入职场的前端小白来说,一整个项目来了,顿时感觉压力山大,张皇失措,也总会感到手忙脚乱.其实不用怕,拆分步骤,把每个步骤做好,做细,一切都迎刃而解,犹如顺藤摸瓜般畅快淋漓. 目录: 概念的介绍(可略) 项目分哪几个阶段(每个阶段注意什么) 如何排期 解决问题的方法 概念的介绍: PM(产品经理)负责需求的提出和项目的引导.PM根据产品特点和发展目标提出一定的需求,并协调各方资源投入开发.若需求层面有不清晰的地方,应当向PM沟通确认,如:需要做什么.希望达到什么效果.哪些内容应重点保证

致初入职场的兄弟姐妹

致初入职场的兄弟姐妹   我很喜欢电影<燃情岁月>中的那句台词--"有些人能够听见自己内心的声音,非常的清楚,他们依循着自己的内心来行事.这些人变得疯狂,或者成为传奇--"(Some people hear their own inner voices with great clearness and they live by what they hear. Such people become crazy, or they become legends. )     这是

初入京都的回想

北京,一个都市繁华的高新产业聚集地,我也就这样的来了.为了我的前端梦想. -----小飒的成长史 2012年 自从2012年进入软件工作室的那一刻起,我的生活就发生了与好友截然不同的状态.想想也觉得很神奇,大一一结束就进入一个软件工作室,这个工作室很励志,自然它叫励志工作室.进入工作室的第一项内容就是接触培训,菜鸟就是菜鸟,培训的学长学姐们说什么都是那张目瞪口呆的听着,似懂非懂,却也听的如此着迷.当时的崇拜感,现在想想也是异常激动. 头两个星期除了看基础视频,就是大家不停的通过八哥打字员这个软件

Head First 之 Design Pattern(一):Strategy Pattern &amp;&amp; 初入设计模式殿堂

头一回阅读<Head First 设计模式>,感觉语言生动形象,把一个个抽象的模式描述的浅显易懂,就像白话文一样. 正如作者推荐如何使用这本书. 你懂Java吗(不太懂... 会C++不影响吧)? 你想学习.了解.记得并应用设计模式,以及其所基于的OO设计原则吗(是的,我正在深入学习C++呢)? 你是不是更喜欢一种轻松愉悦的学习环境(absolutely)? 这本书正是我需要的~   "Head First"就是那些不断学习的人们,像他们致敬,共勉加油~ 使用设计模式最好的

初入前端框架bootstrap--Web前端

Bootstraps是一种简洁.直观.强悍的前端开发框架,它让web开发更迅速.简单.对于初入Bootstrap的小白,高效进入主题很重要,能为我们节省很多时间,下面我将对使用Bootstrap开发前应该做什么做出详细指引,初学者可以围观一下,大神可以忽略哦! 1.下载Bootstrap框架 Bootrap:http://getbootstrap.com/2.3.2/getting-started.html Bootrap中文网:http://v3.bootcss.com/getting-sta