- 浏览: 1070789 次
- 性别:
- 来自: 长沙
文章分类
- 全部博客 (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 2321一、建立网页 <html ... -
SQLITE FOR .NET4.0使用说明以及DLL
2012-06-28 22:07 1206SQLITE FOR .NET4.0使用说明以及DLL -
WinForm中TabControl的一些事件写法(C#)
2012-06-27 20:41 9881在TabControl控件中并没提供单个选项卡的Click事件 ... -
C# 通过字符串动态创建一个窗体
2012-06-27 20:27 1755private void button1_Click(obje ... -
vs2010 打包winform成EXE文件
2012-04-20 14:03 1656见附件 -
C#中DataGridView控件60招
2012-01-13 09:36 65571. DataGridView当前的单元格属性取得、变更 2 ... -
单击dataGridView某一行时将dataGridView当前选择行的某列值赋值给某个文本框
2012-01-13 09:19 2462SelectedRows和CurrentRow之间的区别 ... -
c# winform开发-datagridview开发
2012-01-13 09:18 1730datagridview 操作详解 目录: 1、 取得或 ... -
C# 中奇妙的函数. String Split 和 Join
2011-10-25 10:51 1115很多时候处理字符串数据,比如从文件中读取或者存入 - 我们可能 ... -
asp.net中web.config配置节点大全详解
2011-10-25 10:16 1375asp.net中web.config配置节点大全详解 2 ... -
Entity Framework in ASP.NET MVC Application (三)
2011-05-10 20:31 2471In the previous tutorial you im ... -
Entity Framework in ASP.NET MVC Application (二)
2011-05-10 20:29 1703In the previous tutorial you cr ... -
Entity Frame Work 4.1调用存储过程
2011-05-10 20:24 2145在这个问题上,琢磨了很久了。今天终于找到了调用的方法。 存储 ... -
entity-framework (code-first)实例开发(一)
2011-05-09 20:40 2753The Contoso University Web Appl ... -
使用ef4.1 的dbcontext进行数据库循环操作
2011-04-24 23:06 2269如果你想要调用一个类的方法进行循环操作:官方的例子: Dis ... -
使用EF 4.1的DbContext
2011-04-24 22:36 3643简述:EF4.1包括Code First和DbContext ... -
ADO.NET 访问存储过程
2011-04-24 22:15 1591ADO.NET 访问存储过程其实也比较简单,但是有些小细节部分 ... -
JAVA与.NET的相互调用——通过Web服务实现相互调用(附原代码)
2011-04-24 20:58 1289JAVA与.NET是现今世界竞争激烈的两大开发媒体,两者语言有 ... -
视图模式/视图->视图包
2011-04-24 20:16 1477ASP.NET MVC(自V1起)就支持一个带控制器和视图的V ... -
SkipRequestValidation] –> [AllowHtml]
2011-04-24 20:15 1437ASP.NET MVC内置了防止HTML和跨站脚本注入攻击的支 ...
相关推荐
根据提供的信息,我们可以深入探讨.NET委托(Delegate)的相关概念及其在C#中的应用。下面将详细解释委托的基本概念、用途以及如何在实际编程场景中使用它们。 ### 委托的基本概念 在.NET框架中,委托是一种引用...
委托还与事件密切相关。事件是基于委托的发布/订阅模式,允许对象在特定事件发生时通知其他对象。这种模式在用户界面和组件通信中尤为常见,如按钮点击事件。在.NET Framework中,`System.EventHandler<T>`是一个...
首先我们来探讨一下委托的概念及其用途。 委托在.NET框架中可以被看作是类型安全的函数指针。它提供了一种将方法作为参数传递给另一个方法的方式。通常,委托用于定义回调方法,事件处理程序或在运行时动态地绑定...
根据提供的文件信息,我们可以从中提炼出关于“公司委托个人委托书”的相关知识点,主要包括委托书的概念、作用、种类以及具体的撰写格式和注意事项等。 ### 一、委托书概述 **定义**: 委托书是一种法律文件,它...
### 一、个人委托书的概念 个人委托书是指个人将其拥有的某项权利或事务的一部分或全部授权给另一人处理的一种法律文书。它明确了双方的权利与义务关系,确保了被委托人在特定范围内代表委托人进行活动的合法性。 ...
本文作者张子阳将以两个示例为基础,深入浅出地讲解委托的概念、使用场景以及事件的相关知识,并探讨它们在.NET Framework中的实现机制及其与观察者设计模式的关系。 #### 二、委托的基本概念 **1. 为什么需要委托...
对象不需要知道彼此的具体信息,只需要知道订阅的事件和相关的委托类型,这样可以在不影响其他部分代码的情况下修改具体的实现细节。此外,使用事件和委托也支持面向对象设计原则,如开放/封闭原则和单一职责原则,...
在这个场景中,`RisingSun`可能是在项目中负责实现或解释委托相关功能的人。通过这种方式,团队成员可以分工协作,每个人专注于自己擅长的领域。 总结来说,委托是面向对象编程中的一个重要工具,它允许我们将方法...
首先,让我们了解委托的基本概念。委托在C#中类似于函数指针,但更加安全且类型安全。它定义了一种调用方法的签名,可以存储指向该签名匹配的方法的引用。这样,我们就可以在运行时动态地决定执行哪个方法。例如,在...
为了解决这个问题,我们需要理解并运用线程和委托的概念。本文将详细阐述如何在C# WinForm应用中防止界面卡住,以及线程和委托在其中的作用。 首先,让我们了解一下什么是线程。线程是程序执行的流程,每个进程至少...
首先,理解委托的基本概念是至关重要的。在C#中,委托是一种类型,它封装了指向静态或实例方法的指针。这使得我们可以将方法当作其他方法的参数,或者存储在类的字段中。委托类型是由系统定义的(如`Action`、`Func`...
- 委托人有权了解服务进度,同时需要确保自身是合法持票人,提供真实有效的汇票和其他相关资料。 - 委托人承诺票据无挂失、止付、纠纷,未被司法机关采取措施,并提供必要文件如瑕疵证明、委托收款证明等。 5. **...
3. 使用控件的BeginInvoke方法启动异步操作,传入异步委托和相关的参数。 4. 当异步操作完成后,后台线程会调用预先定义的回调函数,此时可以使用IAsyncResult对象的IsCompleted属性和EndInvoke方法来获取结果。 在...
#### 一、委托的基础概念 在C#中,委托是一种引用类型的数据结构,它允许将方法当作参数进行传递。简而言之,委托就是指向一个方法的引用。委托的主要用途是作为事件处理程序的类型。 **定义委托:** ```csharp ...
在.NET框架中,事件和委托是两种至关重要的概念,它们为对象间的通信提供了一种安全、灵活的方式。本文将深入探讨C#中的事件和委托,以及它们如何在实际编程中应用。 首先,让我们来理解什么是委托。在C#中,委托是...
委托还与异步编程密切相关。`System.Threading.Tasks.Task`类的`ContinueWith`方法就是一个例子,它接受一个`Action<Task>`委托,用于在前一个任务完成后执行后续操作。C# 5.0引入的`async`和`await`关键字,虽然不...
在处理多个相关操作时,委托尤其有用,例如事件处理或并行任务执行。"获取所有委托返回值"这个主题涉及到如何在委托链中收集并处理每个委托方法的返回结果。 在标准的委托调用中,如果一个委托实例绑定了多个方法,...
在.NET框架中,C#语言提供了许多强大的特性,其中泛型、委托和事件是三个核心概念,它们极大地提升了代码的可重用性、性能和安全性。这篇文章将深入解析这三个概念,帮助开发者更好地理解和运用。 首先,让我们来...
根据提供的文件信息,我们可以深入探讨.NET中的委托概念及其具体应用实例。下面将详细介绍与标题、描述及部分代码相关的几个核心知识点: ### .NET中的委托 #### 基本概念 在.NET框架中,委托是一种引用类型的数据...