专栏首页喵叔's 专栏委托表示回调

委托表示回调

敬告:本篇文章是我原创所写,首发于 CSDN Blog,未经本人授权任何网站、公众号、App 不允许转载,授权的网站、公众号、App 需明确标识本篇文章首发地址。需转载请联系 494324190@qq.com

回调是一种由服务端提供一部反馈的机制,它在某些情况下会涉及到多线程或者为同步更新提供入口,在 C# 中如果要编写良好的回调那么就必须用委托来表示回调。委托我们经常用在事件处理的时候,我们也可以将委托用在其他地方,例如我们像以送伞的方式在类和类之间沟通的话,我们就可以使用委托,这是因为委托可以定义类型安全的回调可以在运行的时候配置回调目标,并且可以向多个客户端发出通知。 委托其实是一种对象,它包含指向方法的引用。所指向的方法既可以是静态的又可以是实例方法,在程序运行时可以配置一个或多个客户对象进行通信。

C# 为我们提供了一种简单的方法来使用委托和回调,这种方法就是 lambda 表达式 ,同时在 .NET 中很多委托形式使用的是 PredicateFunc<>Action<> 。在这三种定义委托的形式中第一种形式可以用第二种形式来替代,也就是说 Predicate 是用来判断某条条件是否成立,而 Func 则会根据一些列参数求出某个结果,因此 Func<T,bool> 是等同于 Predicate 的。这里要注意虽然第一种形式可以用第二种形式来替代,但是编译器是不允许它们之间进行转换的,因为即使委托使用的是同一套参数和返回类型,编译器也会按照两个来计算。

Tip:我们常用的 LINQ 就是以委托为基础构建的,回调则用于处理 WPF 和 WinForm 中的跨线程封送。

在 C# 里需要注意的是所有的委托都是多播委托,也就是说会把添加到委托中的所有目标函数都视为一个整体去执行。那么这就导致了两个问题:

  1. 程序在执行这些目标函数时候很有可能发生异常,只要其中一个目标函数发生异常调用链就会中断,进而导致后面剩余的目标函数不被执行;
  2. 程序会把最后执行的目标函数的返回值作为整个委托的返回值,忽略前面那些目标函数的返回值。

要解决上述问题我们可以手动来执行委托。由于每个委托都是一列表的形式来保存其中的目标函数的,因此只要在这个列表上迭代把每个目标函数执行一遍。

总结

如果要在程序运行时执行回调,那么最好的办法是使用委托。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • C#委托

    在C#中的委托关键字是 Delegate,委托类似于C/C++中函数的指针。是存有对某个方法引用的引用类型变量,可在运行时被改变。一般用于实现事件和回调方法。

    喵叔
  • 6搞懂线程池(二)

    抱歉各位多线程专栏托更这么久,这篇文章我们继续讲线程池的相关知识,其中将涉及到如下知识:

    喵叔
  • Entity Framework 一对多关系映射

    EF中关系映射也是一个很关键的内容,关系映射和属性映射一样,也是在 OnModelCreating 中配置映射。EF中的关系映射有如下三种:

    喵叔
  • C#委托与事件学习笔记

          今天跟随视频学习了一下C#中最重要的一些概念之委托与事件。老杨的视频讲的还是挺深入浅出,不过刚接触C#.NET的人还是朦朦胧胧,就像张子阳先生说的“...

    Edison Zhou
  • 【小白学C#】谈谈C#多播委托因异常而终止的解决方案

      前几天,马三在与朋友闲聊技术的时候,朋友忽然抛出一个问题,把马三难倒了,本着求知的精神,回来以后马三就查阅了相关资料并做了一些实验,终于把问题搞明白了,因此...

    马三小伙儿
  • 浅谈委托

    委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法,可以避免在程序中大量使用If-Else(Swit...

    小蜜蜂
  • 编程小白 | 每日一练(188)

    这道理放在编程上也一并受用。在编程方面有着天赋异禀的人毕竟是少数,我们大多数人想要从编程小白进阶到高手,需要经历的是日积月累的学习,那么如何学习呢?当然是每天都...

    C语言入门到精通
  • 干货|程序员到机器学习工程师飞跃的实战经验

    “我是一名软件开发工程师,阅读过一些关于机器学习方面的书籍和博客文章,也学习过一些在线的关于机器学习的公开课。但是,我仍然不知道怎么应用到工程实践中……”

    fishexpert
  • 干货|程序员到机器学习工程师飞跃的实战经验

    “我是一名软件开发工程师,阅读过一些关于机器学习方面的书籍和博客文章,也学习过一些在线的关于机器学习的公开课。但是,我仍然不知道怎么应用到工程实践中……”

    fishexpert
  • 程序员到机器学习工程师的飞跃

    “我是一名软件开发工程师,阅读过一些关于机器学习方面的书籍和博客文章,也学习过一些在线的关于机器学习的公开课。但是,我仍然不知道怎么应用到工程实践中……”

    fishexpert

扫码关注云+社区

领取腾讯云代金券