• C#中的委托(delegate)


     什么是委托?

        委托(delegate)是一种托管方法的数据结构,它是一种引用类型,是对方法的引用,如果说int,string等是对数据类型的定义,那么委托就类似于对“方法类型”的定义,声明一个委托,就是声明一种方法签名,和声明的方法签名相同的方法,都可以被委托实例托管。

        如何声明一个委托?

        delegate 返回值类型 委托名称 (方法参数)

        如何使用委托?

        声明一种委托类型,需要先实例化,然后通过构造传参或者“+=”的方法为委托实例添加托管方法。

        首先,你要确保要添加的方法,是符合委托类型的,也就是方法签名要一致。判断方法签名是否一致的两个要素就是:返回值类型,参数类型、数量,这两项都要一一对应。

        

        请先了解以上三个测试方法,下面进行实例化委托,委托类型为图一所示。

        如图,为我们演示了为委托示例添加托管方法的两个方式,那如何使用委托呢,很简单,就像调用一般的方法一样,实例名(参数)。

        这样,我们之前为委托实例添加的方法,在调用委托时,就根据添加顺序依次调用了,这种通过委托一次性调用多个方法的过程,称作委托的多播。注意,如果委托是有返回值的,那么执行多播以后,委托的返回值是最后添加的方法的返回值,也就是说,之前的方法返回值被依次覆盖掉了。

        有加就有减,我们可以通过“-=”的方式,移除掉某个被委托托管的方法。

        Action和Func泛型委托

        如果你不知道泛型,也不必担心这两个委托难以上手,Action和Func泛型委托是微软为我们实现定义好的两组委托,这两组委托,足以满足我们的日常使用,而无需自己去定义委托。

        先来了解一下它们的定义,

        他们都是处于System命名空间下,所以可以拿来即用。

        Func委托,它托管有返回值的方法,它的构造方法的重载有17个之多,也就是说,你可以用它匹配最多有16个参数的带有返回值的方法

        Action委托,它托管没有返回值的方法,同func委托一样,它可以最多匹配16个参数的无返回值方法

        由此,我们上文中的代码就可以重构一下了:

            把参数类型或者返回值类型(如果需要它们)写在尖括号中,它的实现原理是泛型,如果不明白泛型,请留意后期的文章。

        委托在方法参数中的应用

       如果你想实现方法的多样化定制,使用委托作为参数是必不可少的。

        

        想通过一个方法实现不同的操作,可以动态的去改变代码逻辑,这就需要使用委托,用方法封装一些固定的逻辑,用委托方法写不同的代码逻辑,去实现多样化的需求,这就是委托的魅力所在。

  • 相关阅读:
    windows下 文件资源管理器 的操作
    Visual Studio Code 折叠代码快捷键
    windows 10 取消alt+tab的预览功能
    String.prototype.replace
    Webpack的tapable 为什么要使用 new Funtion 来生成静态代码
    Visual Studio Code 断点调试Nodejs程序跳过node内部模块(internal modules)
    【社群话题分享】有哪些奇葩的技术人员考核方式?
    工信部要求应用商店上新 App 检查 IPv6,这里有一份 IPv6 快速部署指南
    读完这篇文章,5G 就没有秘密了
    双剑合璧——掌握 cURL 和 Dig 走天涯
  • 原文地址:https://www.cnblogs.com/charlesmvp/p/13203982.html
Copyright © 2020-2023  润新知