• C#中的委托(delegate)


     什么是委托?

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

        如何声明一个委托?

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

        如何使用委托?

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

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

        

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

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

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

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

        Action和Func泛型委托

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

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

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

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

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

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

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

        委托在方法参数中的应用

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

        

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

  • 相关阅读:
    C++的Socket的使用源码
    一些程序技术简介
    VMware安装步骤既常见问题
    操作系统和环境准备
    第一章-硬件组成
    python之面向对象
    指向方法之委托(一)
    Django之URL控制器(路由层)
    python之字符编码(四)
    python之字符编码(三)
  • 原文地址:https://www.cnblogs.com/charlesmvp/p/13203982.html
Copyright © 2020-2023  润新知