【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与数据库开 ...
随机推荐
- python排序算法的实现-插入
1.算法: 设有一组关键字{ K 1 , K 2 ,…, K n }:排序开始就认为 K 1 是一个有序序列:让 K 2 插入上述表长为 1 的有序序列,使之成为一个表长为 2 的有序序列:然后让 K ...
- Unix Pipes to Javascript Pipes
Unix Pipes Unix管道扫描稿 简单样例: $ netstat -apn | grep 8080 相信这个大家经常使用,这里就不细说了. 那么管道基本思想是什么呢? 让每个程序只完成一件事, ...
- Living one day at a time (update for a long time)
1, http://acm.hdu.edu.cn/showproblem.php?pid=1228 2014-04-14 10:39:52 分析:字符串处理题... #include<iost ...
- [转] The program can't start because api-ms-win-crt-runtime-l1-1-0.dll is missing
https://www.smartftp.com/support/kb/the-program-cant-start-because-api-ms-win-crt-runtime-l1-1-0dll- ...
- Android学习之Handler消息传递机制
Android只允许UI线程修改Activity里的UI组件.当Android程序第一次启动时,Android会同时启动一条主线程(Main Thread),主线程主要负责处理与UI相关的事件,如用户 ...
- 1. 初探MongoDB —— 介绍、安装和配置
一.写在前面 之前一直以来,都是使用关系型数据库.也很早就听闻,当数据量大的时候,关系型数据库使用起来会有很多问题.诸如查询数据慢,加载花费时间长等等. 也早就耳闻NOSQL(NoSQL = Not ...
- dede教程之后台登录是自动跳出解决方法
有时也不知道什么原因,登录后台时输入全部正确点确认按钮时却会自动跳出.必须输入http://你的域名/dede/login.php才可以登录.通过尝试最终解决了问题,下面分享出来: 1.打开根目录da ...
- SQL Server Profiler:使用方法和指标说明
SQL Server Profiler的中文意思是SQL Server事件探查,一个Sql的监视工具,可以具体到每一行Sql语句,每一次操作,和每一次的连接.感觉这个工具的作用还是很大的,给大家分享一 ...
- 同步与异步&阻塞与非阻塞
摘要 一直为同步异步,阻塞非阻塞概念所困扰,特定总结了下,原来是这么个意思 一直为同步异步,阻塞非阻塞概念所困扰,特定总结了下 一.同步与异步的区别 1.概念介绍 同步:所谓同步是一个服务的完成需要依 ...
- Excel的一些常用设置
1. Freeze表头 (1) 下拉Worksheet的Pane,让该sheet有2个工作区,将该pane下拉到某一特定的行. (2)Window->Freeze Panes.此时会将pane智 ...