【C#】委托
一、委托的基本的写法
internal class Program
{
private static void Main(string[] args)
{
ChainDelegate();
Console.ReadKey();
} public static void ChainDelegate()
{
//创建委托
Feedback feedbackToConsole = new Feedback(FeedbackToConsole);
Feedback feedbackToMsBox = new Feedback(FeedbackToMsBox); //单个委托
feedbackToConsole();
feedbackToMsBox(); //委托链
Feedback fbChain = null;
fbChain += feedbackToConsole;
fbChain += feedbackToMsBox; fbChain();
} public static void FeedbackToConsole(Int32 value)
{
Console.WriteLine(string.Concat("FeedbackToConsole->", value));
} public static void FeedbackToMsBox(Int32 value)
{
Console.WriteLine(string.Concat("FeedbackToMsBox->", value));
} } //定义一个委托
internal delegate void Feedback(Int32 value);
知识点:
1.定义delegate:delegate void Feedbakc(Int32 value)
- delegate是关键字
- void返回值(这里可以定义各种返回值,包括泛型)
- Int32 value定义了输入的参数
2.定义回调函数FeedbackToConsole, FeedbackToMsBox
- 回调的函数的输入参数类型和个数要和定义的委托完全一样
- 返回值是引用类型要遵守协变和逆变(这里可以看我转载的泛型3),值类型不用遵守遵守协变和逆变。
3.创建委托 var feedbackToConsole=new Feedback(FeedbackToConsole)
- 用new关键字来创建委托
- 参数是你的回调函数(要求看第2点)
4.调用委托
feedbackToConsole(1)
feedbackToConsole.Invoke(1)
- 当创建好委托以后,所对应对象名(feedbackToConsole)就相当于委托的函数(FeedbackToConsole)。
5.委托链
Feed fbChain=null;
fbChain+=feedbackToConsole; fbChain=(Feedback)Delegate.Combine(fbChain,feedbackToConsole);
fbChain+=feedbackToMsBox; fbChain=(Feedback)Delegate.Combine(fbChain,feedbackToMsBox);
- 有两种写法都列出来了,我喜欢第一种,比较简单和直接。
- 委托链的调用和调用单个一样 fbChain(3)
- 委托链的调用循序和绑定上去的循序一致(这里先调用feedbackToConsole,再调用feedbackToMsBox)
6.移除委托链中的数据(补充)
fbChain -= feedbackToConsole fbChain=(Feedback)Delegate.Remove(fbChain,feedbackToConsole);二、委托和Lamda表达式
Feedback fd1 = new Feedback(i =>
{
Console.WriteLine(i);
});我们这样用Lamda表达式直接代替了回调函数,如果回调函数不是多个地方使用的话,我个人是比较喜欢这样的写法,而且我会写成:
Feedback fd1 = new Feedback(Console.WriteLine);
这块需要大家对Lamda表达式有一定的理解。
三、泛型委托
1.泛型委托和泛型接口一样,是有协变和逆变的(这里可以看我转载的泛型3)
2.泛型委托我们自己一般是不需要去创建的,因为C#自己提供了两种:
Action<T,......> :只带有输入参数的泛型委托(有N个重载)
Func<in TInput,......out TOutput> : 带输入参数和返回值的泛型委托(有N个重载)3.关于EvenHandler<T>可以看一下【C#】事件
【C#】委托的更多相关文章
- HTML 事件(三) 事件流与事件委托
本篇主要介绍HTML DOM中的事件流和事件委托. 其他事件文章 1. HTML 事件(一) 事件的介绍 2. HTML 事件(二) 事件的注册与注销 3. HTML 事件(三) 事件流与事件委托 4 ...
- C#基础篇 - 理解委托和事件
1.委托 委托类似于C++中的函数指针(一个指向内存位置的指针).委托是C#中类型安全的,可以订阅一个或多个具有相同签名方法的函数指针.简单理解,委托是一种可以把函数当做参数传递的类型.很多情况下,某 ...
- [.NET] C# 知识回顾 - 委托 delegate (续)
C# 知识回顾 - 委托 delegate (续) [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/6046171.html 序 上篇<C# 知识回 ...
- [C#] C# 知识回顾 - 委托 delegate
C# 知识回顾 - 委托 delegate [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/6031892.html 目录 What's 委托 委托的属性 ...
- 9、委托、事件、Lambda
开始 关于委托,肯定是要有问题的. 第一个问题,委托用来干什么? 看.net中的表述:在.net平台下,委托类型用来定义和相应应用程序中的回调.(回调?处理内存中两个实体双向通信的一种技术.) 第 ...
- iOS 委托与文本输入(内容根据iOS编程编写)
文本框(UITextField) 本章节继续编辑 JXHypnoNerd .文件地址 . 首先我们继续编辑 JXHypnosisViewController.m 修改 loadView 方法,向 ...
- C#委托异步调用
参考页面: http://www.yuanjiaocheng.net/webapi/mvc-consume-webapi-get.html http://www.yuanjiaocheng.net/w ...
- JavaScript事件代理和委托(Delegation)
JavaScript事件代理 首先介绍一下JavaScript的事件代理.事件代理在JS世界中一个非常有用也很有趣的功能.当我们需要对很多元素添加事件的时候,可以通过将事件添加到它们的父节点而将事件委 ...
- .NET面试题系列[7] - 委托与事件
委托和事件 委托在C#中具有无比重要的地位. C#中的委托可以说俯拾即是,从LINQ中的lambda表达式到(包括但不限于)winform,wpf中的各种事件都有着委托的身影.C#中如果没有了事件,那 ...
- .NET基础拾遗(4)委托、事件、反射与特性
Index : (1)类型语法.内存管理和垃圾回收基础 (2)面向对象的实现和异常的处理基础 (3)字符串.集合与流 (4)委托.事件.反射与特性 (5)多线程开发基础 (6)ADO.NET与数据库开 ...
随机推荐
- 记一次苦逼的SQL查询优化
最近在维护公司项目时,需要加载某页面,总共加载也就4000多条数据,竟然需要35秒钟,要是数据增长到40000条,我估计好几分钟都搞不定.卧槽,要我是用户的话估计受不了,趁闲着没事,就想把它优化一下, ...
- 利用条件运算符的嵌套来完成此题:学习成绩> =90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示。
利用条件运算符的嵌套来完成此题:学习成绩> =90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示. import java.util.Scanner; public clas ...
- How to set colors of HTML tables
There is a simple way to set the color of tables: use the bgcolor attribute of tag <table>. ...
- ASP.NET 回调技术(CallBack)
在asp.net中客户端与服务器端的交互默认都是整页面提交, 此时客户端将当前页面表单中的数据(包括一些自动生成的隐藏域)都提交到服务器端,服务器重新实例化一个当前页面类的实例响应这个请求,然后将整个 ...
- C++中实现回调机制的几种方式[转]
(1)Callback方式Callback的本质是设置一个函数指针进去,然后在需要需要触发某个事件时调用该方法, 比如Windows的窗口消息处理函数就是这种类型. 比如下面的示例代码,我们在Do ...
- Mvc 拼接Html 导出 Excel(服务器不用安装呦!支持2007以上版本)
新公司,新接触,老方法,更实用. 之前接触过Webform,winfrom 的导出Excel方法 ,优点:省事.缺点:服务器必须安装Office 这几天做项目 和 大牛学习了一下 新的方法,自己加以总 ...
- 再探 Ext JS 6 (sencha touch/ext升级版) 变化篇 (编译命令、滚动条、控制层、模型层、路由)
从sencha touch 2.4.2升级到ext js 6,cmd版本升级到6.0之后发生了很多变化 首先从cmd说起,cmd 6 中sencha app build package不能使用了,se ...
- Subgradient Algorithm
Subgradient是一种可以优化不可微的凸函数的方法. 首先回顾凸函数的定义: $f(y) \geq f(x) + \nabla f(x)^T(y-x), all \hspace{2 pt} x, ...
- matlab processing for video
[filename,pathname,fileindex]=uigetfile('*.avi','请选择一个Avi文件'); video_info=aviinfo([pathname filename ...
- Linux SSH 连接不上
http://blog.csdn.net/cryhelyxx/article/details/46473783 在xshell下用ssh登录远程主机centos出现以下问题: Connection e ...