C# 委托的”四步走“
看了一本《深入了解C#》感觉很不错,对于委托的讲解,给大家摘录了下来!
1.什么是委托
我的拙见:委托就是将方法作为参数,进行传递的
书中的记载:将某种行为“包含”在一个对象中,这个对象可以像其他任何对象那样使用,在该对象中可以齿形对象的行为。可以选择将委托类型看做只定义一个方法的接口,将委托示例看做实现了那个接口的一个对象(感觉这些说发有点空洞)。
2.简单委托的构成
为了让委托做某事,必须满足4个条件
(1)声明委托类型(2)必须有一个方法包含要执行的的代码(3)必须创建一个委托实例(4)必须调用(invoke)委托实例
下面通过一个例子解释
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- namespace weituo
- {
- class Program
- {
- static void Main(string[] args)
- {
- //(2)第二步:必须创建一个委托实例
- ProcessDelegate process;
- Console.WriteLine("请输入用逗号分隔的两个数字:");
- string input = Console.ReadLine();
- int commaPos = input.IndexOf(',');
- double param1 = Convert.ToDouble(input.Substring(0, commaPos));
- double param2 = Convert.ToDouble(input.Substring(commaPos + 1,input.Length - commaPos -1));
- Console.WriteLine("输入M乘法D除法");
- input =Console.ReadLine();
- // 初始化委托变量
- if(input =="M")
- //(4)必须调用(invoke)委托实例
- process = new ProcessDelegate(Multiply);
- //注释:此处也可以写process = Multiply
- else
- //(4)必须调用(invoke)委托实例
- process = new ProcessDelegate(Divide);
- // 使用委托调用函数
- double result = process(param1,param2);
- Console.WriteLine("结果:{0}",result);
- Console.ReadKey();
- }
- //(1)第一步:声明委托类型
- delegate double ProcessDelegate(double param1,double param2);
- //(2)第二步:必须有一个方法包含要执行的的代码(下面是两个方法)
- static double Multiply(double param1, double param2)
- {
- return param1 * param2;
- }
- static double Divide(double param1, double param2)
- {
- return param1 / param2;
- }
- }
- }
实例二:
下面一个例子,自己表一下步骤,如果能找清楚,就应该大致明白了
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- namespace DemoConsole {
- //声明一个委托
- delegate string ConvertMethod(string inString);
- delegate void SayHello(string sayString);
- public class Program {
- static void Main(string[] args) {
- #region MyRegion
- //string[] names = { "Hartono, Tommy", "Adams, Terry", "Andersen, Henriette Thaulow", "Hedlund, Magnus", "Ito, Shu" };
- //Random random = new Random(DateTime.Now.Millisecond);
- //string name = names.ElementAt(random.Next(0, names.Length));
- ////Console.WriteLine(name);
- ////Console.ReadKey();
- //Dictionary<int, string> dic = new Dictionary<int, string>();
- //dic.Add(1, "AAA");
- //dic.Add(2, "BBBB");
- //dic.Add(3, "CCCC");
- //bool t = dic.All(x => x.Key > 0);
- //bool df = dic.Any(x => x.Key > 0);
- //dic.Any();
- #endregion
- ConvertMethod convertMeth;
- string name = "Dakota";
- convertMeth = UppercaseString;
- Console.WriteLine(convertMeth(name));
- Person p1 = new Person();
- Person p2 = new Person();
- SayHello sp1, sp2;
- sp1 = p1.Say;
- sp2 = p2.Say;
- sp1("AAAA");
- sp2.Invoke("BBBBBB");
- Console.ReadKey();
- }
- private static string UppercaseString(string inputString) {
- return inputString.ToUpper();
- }
- }
- public class Person {
- public string Name { get; set; }
- public int Age { get; set; }
- public string Address { get; set; }
- public void Say(string say) {
- Console.WriteLine(this.Name+"__"+say);
- }
- }
- }
C# 委托的”四步走“的更多相关文章
- JAVA EE企业级开发四步走完全攻略 [转]
http://bbs.51cto.com/thread-550558-1.html 本文是J2EE企业级开发四步走完全攻略索引,因内容比较广泛,涉及整个JAVA EE开发相关知识,这是一个长期的计划, ...
- 关于pythoh面向过程开发人员三步转面向对象的补充,再加一步,四步走战略。转面向对象也可以有固定公式。
前言: oop非常非常非常重要.搞不懂oop,就玩不了python,就算能写也一定是写代码时候喜欢靠猜瞎猫碰死老鼠写得心很虚.为什么这么说呢,我也是从面向过程编程到死走过来的,一路def到死,一看到有 ...
- 【JAVA EE企业级开发四步走完全攻略】
本文是J2EE企业级开发四步走完全攻略索引,因内容比较广泛,涉及整个JAVA EE开发相关知识,这是一个长期的计划,单个发blog比较零散,所以整理此索引,决定以后每发一季JAVA EE blog后会 ...
- CentOS下nagios报警飞信部署四步走
CentOS下nagios报警飞信部署四步走 今天 帮群里一兄弟配了下nagios上的飞信,这个东西 我个人感觉还是很实用的,不过好久没配了,今天配置了一遍,顺便 就把过程记录下来了,供大家学习! ...
- C#WPF数据绑定模板化操作四步走
前言:WPF数据绑定对于WPF应用程序来说尤为重要,本文将讲述使用MVVM模式进行数据绑定的四步走用法: 具体实例代码如下: 以下代码仅供参考,如有问题请在评论区留言,谢谢 1 第一步:声明一个类用来 ...
- 组件 layui 表单抓取数据四步走
注意事项: layui 中提交按钮是基于"监听"机制实现的. form.on() 的调用需置于 layui.use 的回调函数中. 末尾的 'return false' 不可或缺, ...
- Tomcat学习四步走:内核、集群、参数及性能
主题简介: 内核实现原理 分布式集群 生产部署关键参数 性能监控和分析 一.内核实现原理 HTTP Web服务器与浏览器之间以HTTP协议通信,浏览器要访问服务器即向服务器发送HTTP请求报文. 如图 ...
- QGIS 3.14插件开发——Win10系统PyCharm开发环境搭建四步走
前言:最近实习要求做一个QGIS插件,网上关于QGIS 3.14插件开发环境搭建的文档不多,而且也不算太全面.正好实习的时候写了一个文档,在这里给大家分享一下. 因为是Word转的Markdown,可 ...
- 【巨杉数据库SequoiaDB】巨杉Tech | 四步走,快速诊断数据库集群状态
1.背景 SequoiaDB 巨杉数据库是一款金融级分布式数据库,包括了分布式 NewSQL.分布式文件系统与对象存储.与高性能 NoSQL 三种存储模式,分别对应分布式在线交易.非结构化数据和内容管 ...
随机推荐
- jacob 给word加印的功能
花了两天时间,参考了一些资料,总算是处理好了这样一个技术点. 关键的心得如下: 使用jacob,重点不是jacob本身,而是office的一些API资料.比如需要知道光标的移动, 包括上下左右的mov ...
- js正则学习及一些正则集合
正则中文版详细说明请看中文版w3cschool-----http://www.w3school.com.cn/jsref/jsref_obj_regexp.asp微软正则表达式语言-快速参考:http ...
- 搭建eclipse环境下 Nutch+Mysql 二次开发环境
最近看了下Nutch,目前Nutch最新版本2.3.1,支持Hbase.MongoDB等存储,但在搭建和测试过程中发现对Mysql 的支持好像有点问题. 后来将Nutch版本改为2.2.1.基于Nut ...
- 分享:Perl打开与读取文件的方法
在Perl中可以用open或者sysopen函数来打开文件进行操作,这两个函数都需要通过一个文件句柄(即文件指针)来对文件进行读写定位等操作. Perl打开与读取文件的方法,供大家学习参考.本文转自: ...
- WebApp
目前的手机APP有三类:原生APP,WebAPP,HybridApp:HybridApp结合了前两类APP各自的优点,越来越流行. Hybrid App的兴起是现阶段移动互联网产业的一种偶然.移动互联 ...
- 每日一“酷”之array
array--国定类型数据序列 array模块定义一个序列数据结构,看起来和list非常相似,只不过所有成员都必须是相同的基本类型. 1.初始化 array实例化时可以提高一个参数来描述允许哪个种数据 ...
- eclipse增加浏览器chrome
1.安装完了google chrome游览器后,如何让eclipse直接用chrome打开jsp 2.添加到eclipse环境中即可, Window(菜单) -- preferences 增加成功后, ...
- 提高SQL语句的性能
一.FROM子句中的表 FROM子表的安排或次序对性能有很大的影响,把较小的表放在前面,把较大的表放在后面,可以得到更高的效率. 二.WHERE子句中的次序 一般来自基表的字段放在结合操作的右侧,要被 ...
- ios开发之数据的持久化存储机制
IOS中数据的持久化保存这块内容,类似于Android中文件的几种常见的存储方式. 对于数据的持久化存储,ios中一般提供了4种不同的机制. 1.属性列表 2.对象归档 3.数据库存储(SQLite3 ...
- Android开发笔记一(hello world)
UI: <Button android:layout_width="wrap_content" android:layout_height="wrap_conten ...