一、委托的基本的写法

  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#】委托的更多相关文章

  1. HTML 事件(三) 事件流与事件委托

    本篇主要介绍HTML DOM中的事件流和事件委托. 其他事件文章 1. HTML 事件(一) 事件的介绍 2. HTML 事件(二) 事件的注册与注销 3. HTML 事件(三) 事件流与事件委托 4 ...

  2. C#基础篇 - 理解委托和事件

    1.委托 委托类似于C++中的函数指针(一个指向内存位置的指针).委托是C#中类型安全的,可以订阅一个或多个具有相同签名方法的函数指针.简单理解,委托是一种可以把函数当做参数传递的类型.很多情况下,某 ...

  3. [.NET] C# 知识回顾 - 委托 delegate (续)

    C# 知识回顾 - 委托 delegate (续) [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/6046171.html 序 上篇<C# 知识回 ...

  4. [C#] C# 知识回顾 - 委托 delegate

    C# 知识回顾 - 委托 delegate [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/6031892.html 目录 What's 委托 委托的属性 ...

  5. 9、委托、事件、Lambda

    开始 关于委托,肯定是要有问题的. 第一个问题,委托用来干什么? 看.net中的表述:在.net平台下,委托类型用来定义和相应应用程序中的回调.(回调?处理内存中两个实体双向通信的一种技术.)   第 ...

  6. iOS 委托与文本输入(内容根据iOS编程编写)

    文本框(UITextField) 本章节继续编辑 JXHypnoNerd .文件地址 . 首先我们继续编辑  JXHypnosisViewController.m 修改  loadView 方法,向  ...

  7. C#委托异步调用

    参考页面: http://www.yuanjiaocheng.net/webapi/mvc-consume-webapi-get.html http://www.yuanjiaocheng.net/w ...

  8. JavaScript事件代理和委托(Delegation)

    JavaScript事件代理 首先介绍一下JavaScript的事件代理.事件代理在JS世界中一个非常有用也很有趣的功能.当我们需要对很多元素添加事件的时候,可以通过将事件添加到它们的父节点而将事件委 ...

  9. .NET面试题系列[7] - 委托与事件

    委托和事件 委托在C#中具有无比重要的地位. C#中的委托可以说俯拾即是,从LINQ中的lambda表达式到(包括但不限于)winform,wpf中的各种事件都有着委托的身影.C#中如果没有了事件,那 ...

  10. .NET基础拾遗(4)委托、事件、反射与特性

    Index : (1)类型语法.内存管理和垃圾回收基础 (2)面向对象的实现和异常的处理基础 (3)字符串.集合与流 (4)委托.事件.反射与特性 (5)多线程开发基础 (6)ADO.NET与数据库开 ...

随机推荐

  1. 九宫格抽奖HTML+JS版

    <html> <head> <meta http-equiv="Content-Type" content="text/html; char ...

  2. FEC难:

     飞雨(314698641)  12:03:16 有人研究fec吗把信源编码好信道编码区别开来 ? 杭州桓泽(84894922)  12:52:54fec实际是一种概括性技术可以从信源的方面做fec就 ...

  3. 在线制作h5——上帝的礼物

    在线制作h5 网址:http://www.godgiftgame.com 网站名称:上帝的礼物 推荐指数:5颗星 功能概要 可以设置背景.元素图片.元素文字.元素图形.声音.加载.链接.分享,生成h5 ...

  4. ubuntu 12 JDK 编译

    下载openjdk源码 http://jdk7.java.net/source.html 安装Ubuntu上面的依赖包: .参考原书 环境变量配置: .去www.hzbook.com上面将深入理解ja ...

  5. Hadoop - 任务调度系统比较

    1.概述 在Hadoop应用,随着业务指标的迭代,而使其日趋复杂化的时候,管理Hadoop的相关应用会变成一件头疼的事情,如:作业的依赖调度,任务的运行情况的监控,异常问题的排查等,这些问题会是的我们 ...

  6. [原创]HierarchyView的实现原理和Android设备无法使用HierarchyView的解决方法

    最近在看一个老外写的东西,发现里面有个类,使用这个类可以让任何设备使用HierarchyView. 众所周知,市面上卖的Android设备,一般都不能使用HierarchyView,所以借此机会,了解 ...

  7. 使用 SyndicationFeed 输出 Rss

    以前生成 RSS 都是使用拼接 Xml 的方式生成的,不仅麻烦而且还不规范. #region 输出指定分类编号的消息源内容... /// <summary> /// 输出指定分类编号的消息 ...

  8. xml和xsd架构文档相关知识

    1.使用架构(XSD)验证XML文件 2.使用自动生成工具: 工具目录:C:\Program Files (x86)\Microsoft SDKs\Windows\v8.0A\bin\NETFX 4. ...

  9. java 使用 ScriptEngineManager 解析逻辑表达式

    将表达式替换成js使用的文本格式.然后带入eval函数. public class JieXi { public static void main(String[] args) throws Exce ...

  10. ubuntu下解决wireshark权限问题

    wireshark要监控eth0,但是必须要root权限才行.但是,直接用root运行程序是相当危险,也是非常不方便的. 解决方法如下: 1.添加wireshark用户组 sudo groupadd ...