博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【C#】委托
阅读量:7097 次
发布时间:2019-06-28

本文共 2441 字,大约阅读时间需要 8 分钟。

 

一、委托的基本的写法

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(1);            feedbackToMsBox(2);            //委托链            Feedback fbChain = null;            fbChain += feedbackToConsole;            fbChain += feedbackToMsBox;            fbChain(3);        }        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);
View Code

 知识点:

  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>可以看一下

       

  •            

转载于:https://www.cnblogs.com/guochenkai/p/3910154.html

你可能感兴趣的文章
Hello World 之 控制台版本(Console Application)
查看>>
linux下nginx+php+mysql 自助环境搭建
查看>>
udp通信
查看>>
国家模式c++
查看>>
假设动态运行java文字,当在脚本式配置,这是非常方便的
查看>>
android4.0 的图库Gallery2代码分析(三) 之Applition的初始化准备
查看>>
SOM自组织映射网络 教程
查看>>
lintcode:寻找旋转排序数组中的最小值 II
查看>>
maven项目配置Jetty服务器
查看>>
树莓派学习笔记——交叉编译练习之SQLite3安装
查看>>
android stuido build 慢的解决办法
查看>>
Eclipse 插件安装方法和插件加载失败解决办法
查看>>
第四节:教你如何快速让浏览器兼容ES6特性
查看>>
C#使用IrisSkin2.dll美化WinForm程序界面
查看>>
Appium移动自动化测试(四)--one demo
查看>>
nginx配置location总结及rewrite规则写法
查看>>
python 登陆接口
查看>>
RedHat7 部署ELK日志分析系统
查看>>
DS实验题 Missile
查看>>
微信上 网页图片点击全屏放大
查看>>