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 三种存储模式,分别对应分布式在线交易.非结构化数据和内容管 ...
随机推荐
- C++ Double Ended Queues(双向队列)
双向队列和向量很相似,但是它允许在容器头部快速插入和删除(就像在尾部一样). Constructors 创建一个新双向队列 Operators 比较和赋值双向队列 assign() 设置双向队列的值 ...
- C++ 11 之Lambda
1.Lambda表达式来源于函数式编程,说白就了就是在使用的地方定义函数,有的语言叫“闭包”,如果 lambda 函数没有传回值(例如 void ),其回返类型可被完全忽略. 定义在与 lambda ...
- .NET中的注释种类,单行注释、多行注释、文档注释。。。
注释不是给编译器看的,而是给程序员看的.是程序员之间交流的一种方式.好的程序员一定要有完善的注释. .NET注释类型. 1.单行注释 // a.当代码行比较短时,注释可以放在代码后面. b.当代码行 ...
- hadoop2.2.0伪分布式搭建
1.准备Linux环境 1.0点击VMware快捷方式,右键打开文件所在位置 -> 双击vmnetcfg.exe -> VMnet1 host-only ->修改subnet ...
- 主机win10与虚拟机ubuntu14.04通信
主机是笔记本win10系统,在virtualbox虚拟机里面安装了ubuntu14.04系统,现在想让它们互联互通. 我的笔记本是通过路由器无线连接接入的互联网,设置了固定ip:192.168.0.4 ...
- 关于SQLite的创建以及使用相关说明
关于SQLite的创建以及使用相关说明 没有给出具体的程序,但看完这后可能对你有所帮助. 数据库操作基本知识: execSQL(String sql): 执行一个数据库语句 insert(table, ...
- linux终端io笔记
简介 终端的两种工作模式:以行为单位的工作模式,以字符数或时间为单位自定义模式 终端判断函数: int isatty(int fd) 终端属性的获取与设置: int tcgetattr(int fd, ...
- redis使用场景
Redis应用场景 Redis开创了一种新的数据存储思路,使用Redis,我们不用在面对功能单调的数据库时,把精力放在如何把大象放进冰箱这样的问题上,而是利用Redis灵活多变的数据结构和数据操作 ...
- thinkphp中curl的使用,常用于接口
/lib/action/PublicAction.class.php class PublicAction extends Action{ //curl,返回数组 public function ge ...
- 注册微信小程序
注册微信小程序 小程序是一种新的开放能力,可以在微信内被便捷地获取和传播,同时具有出色的使用体验.开发者可以根据平台提供的能力,快速地开发一个小程序. 开放内容包括: 开放注册范围:企业.政府.媒体. ...