- 浏览: 1042421 次
- 性别:
- 来自: 长沙
文章分类
- 全部博客 (639)
- 服务器配置篇 (58)
- hibernate篇 (14)
- spring篇 (33)
- struts篇 (28)
- JS篇 (46)
- 其他技术篇 (46)
- 数据库集群配置 (6)
- JAVA基础相关 (48)
- 分布式框架HadHoop的应用 (2)
- FLEX篇 (8)
- SQLSERVER技术 (32)
- Android学习 (13)
- amchart学习笔记 (1)
- openfire+smark搭建即时通讯 (9)
- Linux学习 (18)
- Oracle数据库 (15)
- 网站优化技术 (12)
- mysql数据库 (2)
- 项目学习总结 (18)
- 工具类(JAVA) (12)
- 工具类(JS) (2)
- 设计模式 (10)
- Lucene学习 (24)
- EJB3学习 (6)
- Sphinx搜索引擎 (3)
- 工作中用到的软件小工具 (5)
- .NET (49)
- JAVA 连接SQLSERVER2008步骤 (1)
- MongoDB (19)
- Android手机开发 (3)
- Maven (6)
- vue (9)
- Shiro (4)
- mybatis (3)
- netty框架 (1)
- SpringCloud (3)
- spring-cloud (7)
- Git (1)
- dubbo (2)
- springboot (13)
- rocketmq (1)
- git学习 (2)
- kafka服务器 (2)
- linux (10)
- WEB系统辅助项目 (1)
- jenkins (2)
- docker (4)
- influxdb (3)
- python (2)
- nginx (1)
最新评论
-
jiangfuofu555:
这样数据量大,效率怎么样?
sqlserver 实现分页的前台代码 以及后台的sqlserver语句 -
w156445045:
博主请问下,如何做到实时的刷新呢,
另外我后台是Java 谢谢 ...
web 版本的汽车仪表盘,非常好看。还有各种图形 -
jackyin5918:
<transportConnector name=&qu ...
ActiveMQ的activemq.xml详细配置讲解 -
握着橄榄枝的人:
你这个不是spring1.x的吧
spring1.x使用AOP实例 -
xiaophai:
全乱套了!
openfire+spark搭建完美的及时通讯
委托提供了类似C++中函数指针的功能,简单地说委托类型就是面向对象函数指针,
不过C++的函数指针只能够指向静态的方法,
而委托除了可以指向一个静态的方法之外还可以指向对象实例的方法,并且委托是完全面向对象且使用安全的类型。
也就是说:委托可以看成是一种类型安全的函数指针,它用来代理一类符合其要求的方法(包括静态方法和动态方法即实例的方法),同时它又可以作为一个方法的参数进行传。
对“符合其要求”的解释:委托的 返回类型 和 参数 要与被代理的方法的 返回类型 和 参数 一致(不仅类型一致,参数个数也要相同)。
委托的优点:委托允许程序设计师可以在执行时期传入方法的名称动态地决定欲调用的方法,灵活性和扩张性非常强。
委托一般用在事件、多线程和通用类库中。
下面列举了5个示例对委托的概念和基本用法进行说明(这些例子来自陈广老师和楚广明老师的课堂,自己稍作了修改和融合)
为了省去创建GUI那些繁琐的步骤,更清晰地逼近委托的本质,接下来的所有程序都是控制台程序,程序最后的Console.ReadKey()是为了使程序中途停下来,以便看清楚执行过程中的输出。
一、
View Code
using System; //一、代理静态方法示例 namespace DelegateDemo { //委托的本质就是一个类,任何可以声明类的地方都可以声明委托 delegate void EatDelegate(string food);//委托的声明;其返回类型和参数要与被代理的方法的返回类型和参数一致 class MyDelegate { static void ZsEat(string food)//被代理的方法 { Console.WriteLine("张三吃:" + food); } static void LsEat(string food)//被代理的方法 { Console.WriteLine("李四吃:" + food); } static void WwEat(string food)//被代理的方法 { Console.WriteLine("王五吃:" + food); } static void Main(string[] args) { EatDelegate zsEat = new EatDelegate(ZsEat);//委托的实例化;代理的静态方法 zsEat("西瓜");//委托的使用; EatDelegate lsEat = LsEat;//代理的静态方法,直接将方法名传递给委托变量 lsEat("香蕉"); EatDelegate wwEat = new EatDelegate(WwEat);//委托的实例化;代理的静态方法 EatDelegate eatChain; Console.WriteLine("张三、李四、王五开座谈会"); eatChain = zsEat + lsEat + wwEat;//委托链 eatChain("西瓜"); Console.WriteLine(); Console.WriteLine("李四出去接电话"); eatChain -= lsEat; eatChain("香蕉"); Console.WriteLine(); Console.WriteLine("李四回来了"); eatChain += lsEat; eatChain("橘子"); Console.WriteLine(); Console.WriteLine("这是赵六来了"); eatChain += delegate(string food) { Console.WriteLine("赵六吃:" + food); };//匿名方法; eatChain("苹果"); Console.ReadKey(); } } }
输出结果:
二、
View Code
using System; //二、代理动态方法示例 namespace DelegateDemo { //委托的本质就是一个类,任何可以声明类的地方都可以声明委托 delegate void EatDelegate(string food);//委托的声明;其返回类型和参数要与被代理的方法的返回类型和参数一致 class Man { private string name; public Man(string name) { this.name = name; } public void Eat(string food)//被代理的方法 { Console.WriteLine(name + "吃:" + food); } } class MyDelegate { static void Main(string[] args) { Man zs = new Man("张三"); Man ls = new Man("李四"); Man ww = new Man("王五"); EatDelegate zsEat = new EatDelegate(zs.Eat);//委托的实例化;代理的动态方法,即实例的方法 zsEat("西瓜");//委托的使用; EatDelegate lsEat = ls.Eat;//代理的动态方法,直接将实例的方法名传递给委托变量 lsEat("香蕉"); EatDelegate wwEat = new EatDelegate(ww.Eat);//委托的实例化;代理的动态方法 EatDelegate eatChain; Console.WriteLine("张三、李四、王五开座谈会"); eatChain = zsEat + lsEat + wwEat;//委托链 eatChain("西瓜"); Console.WriteLine(); Console.WriteLine("李四出去接电话"); eatChain -= lsEat; eatChain("香蕉"); Console.WriteLine(); Console.WriteLine("李四回来了"); eatChain += lsEat; eatChain("橘子"); Console.WriteLine(); Console.WriteLine("这是赵六来了"); eatChain += delegate(string food) { Console.WriteLine("赵六吃:" + food); };//匿名方法; eatChain("苹果"); Console.ReadKey(); } } }
输出结果:与一相同。
三、
View Code
using System; //三、代理作为方法的参数示例 namespace DelegateDemo { delegate void EatDelegate(string food); class Man { private string name; public Man(string name) { this.name = name; } public void Eat(string food) { Console.WriteLine(name + "吃:" + food); } } class MyDelegate { static void EatTogether(string food, params EatDelegate[] values)//代理作为方法的参数进行传递 { if (values == null) { Console.WriteLine("座谈会结束"); } else { EatDelegate eatChain = null; foreach (EatDelegate value in values) { eatChain += value; } eatChain(food); } } static void Main(string[] args) { Man zs = new Man("张三"); Man ls = new Man("李四"); Man ww = new Man("王五"); EatDelegate zsEat = new EatDelegate(zs.Eat); EatDelegate lsEat = new EatDelegate(ls.Eat); EatDelegate wwEat = new EatDelegate(ww.Eat); Console.WriteLine("张三、李四、王五开座谈会"); EatTogether("西瓜", zsEat, lsEat, wwEat); Console.WriteLine(); Console.WriteLine("李四出去接电话"); EatTogether("香蕉", zsEat, wwEat); Console.WriteLine(); Console.WriteLine("李四回来了"); EatTogether("橘子", zsEat, lsEat, wwEat); Console.WriteLine(); EatTogether(null, null); Console.ReadKey(); } } }
输出结果:
四、
View Code
using System; //四、执行时传入方法的名称动态地决定欲调用的方法 namespace DelegateDemo { class MyDelegate { public delegate int GenericFun(int a, int b); public static int Add(int a, int b) { return a + b; } public static int Sub(int a, int b) { return a - b; } public static int PrintResult(GenericFun action, int a, int b)//执行时传入方法的名称动态地决定欲调用的方法 { int result = action(a, b); return result; } static void Main(string[] args) { Console.WriteLine("3+4=" + PrintResult(Add, 3, 4)); Console.WriteLine("3-4=" + PrintResult(Sub, 3, 4)); Console.ReadKey(); } } }
输出结果:
3+4=7
3-4=-1
五、
View Code
using System; //五、最后一个例子 namespace DelegateDemo { delegate int MathOperationsDelegate(int value); class MathOperations { public static int MultiByTwo(int value) { return value * 2; } public static int Square(int value) { return value * value; } } class MyDelegate { public static void ProcessAndDisplayRusult(MathOperationsDelegate action, int value) { int result = action(value); Console.WriteLine(result); } static void Main() { MathOperationsDelegate[] operations = { new MathOperationsDelegate(MathOperations.MultiByTwo), new MathOperationsDelegate(MathOperations.Square) }; for (int i = 0; i < operations.Length; i++) { Console.WriteLine("使用operation[{0}]", i); ProcessAndDisplayRusult(operations[i], 3); } Console.ReadKey(); } } }
输出结果:
使用operation[0]
6
使用operation[1]
9
<script type="text/javascript"></script>
发表评论
-
C# WinForm程序如何与js交互
2012-07-15 22:28 2254一、建立网页 <html ... -
SQLITE FOR .NET4.0使用说明以及DLL
2012-06-28 22:07 1160SQLITE FOR .NET4.0使用说明以及DLL -
WinForm中TabControl的一些事件写法(C#)
2012-06-27 20:41 9829在TabControl控件中并没提供单个选项卡的Click事件 ... -
C# 通过字符串动态创建一个窗体
2012-06-27 20:27 1684private void button1_Click(obje ... -
vs2010 打包winform成EXE文件
2012-04-20 14:03 1569见附件 -
C#中DataGridView控件60招
2012-01-13 09:36 64811. DataGridView当前的单元格属性取得、变更 2 ... -
单击dataGridView某一行时将dataGridView当前选择行的某列值赋值给某个文本框
2012-01-13 09:19 2409SelectedRows和CurrentRow之间的区别 ... -
c# winform开发-datagridview开发
2012-01-13 09:18 1689datagridview 操作详解 目录: 1、 取得或 ... -
C# 中奇妙的函数. String Split 和 Join
2011-10-25 10:51 1057很多时候处理字符串数据,比如从文件中读取或者存入 - 我们可能 ... -
asp.net中web.config配置节点大全详解
2011-10-25 10:16 1333asp.net中web.config配置节点大全详解 2 ... -
Entity Framework in ASP.NET MVC Application (三)
2011-05-10 20:31 2431In the previous tutorial you im ... -
Entity Framework in ASP.NET MVC Application (二)
2011-05-10 20:29 1654In the previous tutorial you cr ... -
Entity Frame Work 4.1调用存储过程
2011-05-10 20:24 2070在这个问题上,琢磨了很久了。今天终于找到了调用的方法。 存储 ... -
entity-framework (code-first)实例开发(一)
2011-05-09 20:40 2708The Contoso University Web Appl ... -
使用ef4.1 的dbcontext进行数据库循环操作
2011-04-24 23:06 2206如果你想要调用一个类的方法进行循环操作:官方的例子: Dis ... -
使用EF 4.1的DbContext
2011-04-24 22:36 3600简述:EF4.1包括Code First和DbContext ... -
ADO.NET 访问存储过程
2011-04-24 22:15 1545ADO.NET 访问存储过程其实也比较简单,但是有些小细节部分 ... -
JAVA与.NET的相互调用——通过Web服务实现相互调用(附原代码)
2011-04-24 20:58 1258JAVA与.NET是现今世界竞争激烈的两大开发媒体,两者语言有 ... -
视图模式/视图->视图包
2011-04-24 20:16 1431ASP.NET MVC(自V1起)就支持一个带控制器和视图的V ... -
SkipRequestValidation] –> [AllowHtml]
2011-04-24 20:15 1387ASP.NET MVC内置了防止HTML和跨站脚本注入攻击的支 ...
相关推荐
C#程序设计中有关委托的一些位内容:委托的概念 面向对象的核心思想之一就是将数据和对数据的操作封装为一个整体……
这个是我听讲完陈广老师的《C#程序设计入门与实例视频教程》中的委托后,自己写的笔记,自认为是写的很详细的了,反正以我目前的水平,感觉掌握这些有关委托的概念,应该是可以应用了,希望能对大家有点帮助。
主要介绍了JQuery事件委托原理与用法,结合具体实例形式分析了jQuery事件委托相关概念、原理及使用技巧,需要的朋友可以参考下
主要介绍了JS中的事件委托,结合实例形式简单分析了javascript事件委托的概念、功能、使用方法及相关注意事项,需要的朋友可以参考下
而且从用途上讲主要也两方面:将“方法对象化”和实现“观察者模式”,本文围绕这两方面,分享本人对委托中相关概念的理解,顺便介绍一些相关的其它东西。 2. 闭包 闭包似乎在javascript里谈得比较多,其实...
对于事件来讲,首先,我们需要了解这样几个概念:事件;事件处理程序;事件类型;事件流;事件冒泡;事件捕获;事件对象;事件方面的性能优化(事件委托、移除事件处理程序);常见的浏览器兼容问题。
主要介绍了C#中委托用法,较为详细的分析了C#中委托的概念与相关的使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下
反对当被问及如果他必须从头开始重写 Java 时他会做些什么不同的事情时,James Gosling 建议他可以并编写语言。 资料来源:为什么存在当 ES6 到来时,类... 在这篇文章中阅读更多相关信息:它能做什么在 JavaScript 中
1.理解程序错误和异常的概念。 2.掌握Visual Stdio.NET 2010的调试器的使用方法。 3.掌握C#的try-catch,finally,throw语句的使用方法。 二、实验要求 1.熟悉Visual Stdio.NET2010的基本操作方法。 2.认真阅读本章...
主要介绍了PHP __call()方法实现委托,简单介绍了委托的概念、原理,并结合实例形式分析了__call()方法实现委托的相关操作技巧,需要的朋友可以参考下
域、属性与事件域的定义及使用 属性的概念 委托的概念与使用 事件
二、必须要区分投资权益和股东权益是两个不同的概念。 三、隐名投资人(即实际出资人)面临着股权被无权处分的巨大风险,对此,法院认定按照物权法关于无权处分的处理原则处理,那么隐名投资人将极有可能面临...
所有信托概念化是否以及在多大程度上需要风险、有意识地考虑风险、意愿和/或委托人和受托人的主动选择; 风险与信任的可分离性; 信任的心理与行为本质; 信任的认知与情感性质; 信任源于某些基础而不是其他基础的...
9.对于一个实现了IDisposable接口的类,以下哪些项可以执行与释放或重置非托管资源相关的应用程序定义的任务?(多选) ( ABC ) A.Close B.DisposeC.Finalize D.using E.Quit 10.Net依赖以下哪项技术实现跨语言互用性...
本文首先介绍了线程的有关概念,接着介绍了线程的生命期及其状态间的转换,多线程的调度 原则,线程的死锁,详细阐述了多线程的两种实现方法: 由Thread类派生子类;实现Runnable接口
A、雇佣与被雇佣 B、委托与服务 C、委托与代理 D、领导与被领导 4.为项目监理组织实施目标控制建立前提条件,提供控制的依据、保障、措施、方法的工程建设监理文件是( B )。 A、监理大纲 B、监理规划 C、监理...
《设计模式:NET并行编程》结合大量的项目实践,介绍了与并行编程相关的概念、方法和应用。本书共7章:第1章主要介绍并行编程的基本概念与并行计算的基础理论,第2章主要介绍并行循环的知识,第3章介绍并行任务处理...
《设计模式:NET并行编程》结合大量的项目实践,介绍了与并行编程相关的概念、方法和应用。本书共7章:第1章主要介绍并行编程的基本概念与并行计算的基础理论,第2章主要介绍并行循环的知识,第3章介绍并行任务处理...
在中华人民共和国相关法律规定范围框架内,双方现就本协议股份代持的有关事宜,经协商一致,达成如下协议: 一、股份代持关系的界定 1.1 为明确代持股份的所有权,甲、乙双方通过本协议确认,代持股份实际由甲方所有...