一、委托的基本的写法

  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. .NET 4.6中的性能改进

    .NET 4.6中带来了一些与性能改进相关的CLR特性,这些特性中有一部分将会自动生效,而另外一些特性,例如SIMD与异步本地存储(Async Local Storage)则需要对编写应用的方式进行某 ...

  2. 利用Aspose文档转图片

    通过使用Aspose您可以轻松的将您的文档转换成真正的图片格式,最好的保证您的内容将实际可见,与其他格式相比,它并不存在查看工具的安装问题. 准备工作: 1:下载Aspose组件包:http://do ...

  3. 菜鸟译文(三)——JDK6和JDK7中substring()方法的对比

    substring(int beginIndex, int endIndex)方法在JDK6和JDK7中是不同的.了解他们的区别可以让我们更好的使用这个方法.方便起见,以下用substring() 代 ...

  4. 如何配置ssh免密码登录

    [TOC] 如果你在管理一堆unix机器,每次登录都要输入密码是挺烦的事情,一方面为了安全我们一般不会将所有机器的密码都设置成一样,另一方面就算一样每次都输入一遍也很麻烦. 这种情况下我们一般是用ss ...

  5. 阿里前DBA的故事

    别人怎么享受生活,与你无关.你怎么磨砺与你有头.引用同事周黄江的一句话,很多人努力程度还远没有到拼天赋的时候. 成功的人都是那种目标很明确的人.对于文中厨师的经历很感兴趣.不管是IT还是餐饮,哪个行业 ...

  6. Redrain个人维护并使用的DuiLib和UiLib库源代码下载地址

    转载请说明原出处:http://blog.csdn.net/zhuhongshu/article/details/40740353,谢谢~~ 首先说明一下Duilib和Uilib的差别:UiLIb是D ...

  7. [转]安卓开发startservice 和bindservice详解

    原文 作者:aikongmeng 来源:安卓中文网 博主暗表:搜到此文,终于为我解惑,bindService并不会真正启动service,不会调用onStartCommand!还需要再bind之前st ...

  8. CreateProcessAsUser,C#写的windows服务弹框提示消息或者启动子进程

    服务(Service)对于大家来说一定不会陌生,它是Windows 操作系统重要的组成部分.我们可以把服务想像成一种特殊的应用程序,它随系统的“开启-关闭”而“开始-停止”其工作内容,在这期间无需任何 ...

  9. Objective-C之类和对象

    http://www.cnblogs.com/kenshincui/p/3861302.html

  10. java攻城狮之路(Android篇)--ListView与ContentProvider

    一.ListView 1.三种Adapter构建ListView ListView添加条目的时候, 可以使用setAdapter(ListAdapter)方法, 常用的ListAdapter有三种 B ...