基于C#委托的深入分析
1.委托的定义
委托可以看成是一种数据类型,可以用于定义变量能接受的值只能是一个方法。
委托简单的示例:
- namespace DelegateDemo
- {
- class Program
- {
- public delegate int MathOptDelegate(int value1,int value2);
- public int add(int value1, int value2)
- {
- return value1 + value2;
- }
- static void Main(string[] args)
- {
- MathOptDelegate mod;
- Program p = new Program();
- mod =p.add;
- Console.WriteLine(mod(,));
- Console.ReadKey();
- }
- }
- }
利用委托的构造函数创建委托
- namespace DelegateDemo
- {
- class Program
- {
- public delegate int MathOptDelegate(int value1,int value2);
- public int add(int value1, int value2)
- {
- return value1 + value2;
- }
- static void Main(string[] args)
- {
- Program p = new Program();
- MathOptDelegate mod = new MathOptDelegate(p.add);
- Console.WriteLine(mod(,));
- Console.ReadKey();
- }
- }
- }
从这个示例中可以得出这样的直观印象:
委托可以堪称是一个方法的容器,将某一个具体的方法装入后,就可以把它当成方法一样使用。
2.委托的调用列表
从上一个例子看,委托变量可以引用某一个方法,调用它就相当于调用这个方法。
如果委托今年仅是方法调用的另一种形式,那何必多此一举引入委托这一特性?直接调用方法不是更简单明了?
因为委托变量不仅可以引用另一个方法,还可以组合多的方法并批量执行它们。
- namespace DelegateDemo2
- {
- class Program
- {
- public delegate void MyDelegate(String str);
- public static void hello(String str)
- {
- Console.WriteLine(str+"你好");
- }
- public static void goodbye(String str)
- {
- Console.WriteLine(str+"再见");
- }
- static void Main(string[] args)
- {
- MyDelegate a,b,c,d;
- a = Program.hello;
- a("a");
- b = Program.goodbye;
- b("b");
- c = a + b;//等价将两个方法体合并
- c("c");// c你好 c再见
- d = c - a;
- d("d");//d再见
- Console.ReadKey();
- }
- }
- }
像C这样的委托变量可称为多路委托变量。
可以用加法运算符来组合单个委托变量为多路委托变量。类似的,也可以使用减法运算符来从一个多路委托变量中移除某个委托变量。
- namespace DelegateDemo2
- {
- class Program
- {
- public delegate void MyDelegate(String str);
- public static void hello(String str)
- {
- Console.WriteLine(str+"你好");
- }
- public static void goodbye(String str)
- {
- Console.WriteLine(str+"再见");
- }
- static void Main(string[] args)
- {
- MyDelegate a,b,c,d;
- a = Program.hello;
- a("a");
- b = Program.goodbye;
- b("b");
- c = a + b;//等价将两个方法体合并
- c("c");// c你好 c再见
- d = c - a;
- d("d");//d再见
- Delegate[] ds;
- ds = c.GetInvocationList();
- foreach(Delegate s in ds)
- {
- Console.WriteLine(s);
- //DelegateDemo2.Program+MyDelegate
- //DelegateDemo2.Program+MyDelegate
- }
- Console.WriteLine(ds.Length);
- Console.ReadKey();
- }
- }
- }
如果委托定义的方法有返回值,则多路委托变量的返回值为委托调用列表中最后一个方法的返回值,中间调用的方法返回值会被丢弃。
使用泛型委托:
Func系列委托
以下是Func熄了委托的定义,依其泛型类型参数的多少有多个重载形式:
public delegate TResult Func<Tresult>();
public delegate TResult Func<T,Tresult>();
基于C#委托的深入分析的更多相关文章
- C# 基于委托的事件
事件基于多播委托的特性. 多播委托事实上就是一组类型安全的函数指针管理器,调用则执行顺序跳转到数组里所有的函数指针里执行. class Program { public class CarInfoEv ...
- 并发编程概述 委托(delegate) 事件(event) .net core 2.0 event bus 一个简单的基于内存事件总线实现 .net core 基于NPOI 的excel导出类,支持自定义导出哪些字段 基于Ace Admin 的菜单栏实现 第五节:SignalR大杂烩(与MVC融合、全局的几个配置、跨域的应用、C/S程序充当Client和Server)
并发编程概述 前言 说实话,在我软件开发的头两年几乎不考虑并发编程,请求与响应把业务逻辑尽快完成一个星期的任务能两天完成绝不拖三天(剩下时间各种浪),根本不会考虑性能问题(能接受范围内).但随着工 ...
- .NET面试题系列[7] - 委托与事件
委托和事件 委托在C#中具有无比重要的地位. C#中的委托可以说俯拾即是,从LINQ中的lambda表达式到(包括但不限于)winform,wpf中的各种事件都有着委托的身影.C#中如果没有了事件,那 ...
- [转载]C#委托和事件(Delegate、Event、EventHandler、EventArgs)
原文链接:http://blog.csdn.net/zwj7612356/article/details/8272520 14.1.委托 当要把方法作为实参传送给其他方法的形参时,形参需要使用委托.委 ...
- .Net Framework中的标准委托和事件_1
.Net Framework中的标准委托,已经定义在命名空间System中, namespace System { public delegate void EventHandler(object s ...
- c#中委托和事件(续)(转)
本文将讨论委托和事件一些更为细节的问题,包括一些大家常问到的问题,以及事件访问器.异常处理.超时处理和异步方法调用等内容. 为什么要使用事件而不是委托变量? 在 C#中的委托和事件 中,我提出了两个为 ...
- C# 委托总结
总结 委托的本质: 委托是一种特殊的数据类型,它表示某种特定类型的函数,并且可以表示多个函数,将这些函数串联起来.使用委托就好像函数调用一样. 委托实质上是一个类,编译器会根据关键字delegate自 ...
- 第一章、C#委托和事件(Delegate、Event、EventHandler、EventArgs)
第一章.C#委托和事件(Delegate.Event.EventHandler.EventArgs) 分类: 学习笔记-C#网络编程2012-12-08 14:10 7417人阅读 评论(3) 收藏 ...
- C#委托(Delegate)学习日记
在.NET平台下,委托类型用来定义和响应应用程序中的回调.事实上,.NET委托类型是一个类型安全的对象,指向可以以后调用的其他方法.和传统的C++函数指针不同,.NET委托是内置支持多路广播和异步方法 ...
随机推荐
- Crypto++库安装、测试
项目中需要使用到C++加密解密库,选择了Crypto++这个开源库,于是先安装并写一个小例子试试 一.下载 网址:http://www.cryptopp.com/#download 二.打开项目 下载 ...
- webdriver下拉框中选择option的方法提醒
select这个标签比较特殊 下面的option不能用点击下拉框,再点击选中这种方法 前端代码: <html> <body> <select id="Shipp ...
- Java重构-策略模式、状态模式、卫语句
前言 当代码中出现多重if-else语句或者switch语句时.弊端之一:如果这样的代码出现在多处,那么一旦出现需求变更,就需要把所有地方的if-else或者switch代码进行更改,要是遗漏了某一处 ...
- 【转载】利用MAVEN打包时,如何包含更多的资源文件
首先,来看下MAVENx项目标准的目录结构: 一般情况下,我们用到的资源文件(各种xml,properites,xsd文件等)都放在src/main/resources下面,利用maven打包时,ma ...
- php对gzip文件或者字符串解压实例参考
要采集一个网站,目标站采用了gzip压缩传输网页,本来应该只要发送一个http头 Accept-Encoding: identity或者干脆不发送这个头等,就可以使目标站返回没有经过gzip压缩的页面 ...
- 在NodeJS中使用流程控制工具Async
本文介绍一款流程控制工具async,在编写接口或者编写测试用例的过程中总是会用到它. 由于nodejs是异步编程模型,有一些在同步编程中很容易做到的事情,现在却变得很麻烦.Async的流程控制就是为了 ...
- 同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)四种调用方式
1. 概念理解 在进行网络编程时,我们常常见到同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)四种调用方式: 同步/异步主要针对C端: 同步: ...
- iOS开发常见问题(不断更新)
1.如何从程序退出到桌面 在单击事件中 exit(0);即可. 2.如何强制横屏 在你需要横屏的控制器里加入如下代码 - (BOOL)shouldAutorotate{ return NO; } - ...
- haml入门
1.什么是Haml Haml是HTML abstraction markup language,遵循的原则是标记应该是美的.Haml能够加速和简化模版,长处是简洁.可读.高效. 2.erbm模板和ha ...
- selenium-webdriver 中执行js代码
#获取标签的text文本值 js1="return document.getElementById('key1').innerText" dr.execute_script(js1 ...