C#中委托和匿名委托的具体介绍


本文摘自PHP中文网,作者黄舟,侵删。

这篇文章主要为大家详细介绍了C#委托与匿名委托的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本来是想写一篇《委托与lambda表达式的前世今生》,但仅委托部分已经写了很多内容,于是就此分开关于Lambda表达是的内容后续再写吧。

不知道Lambda表达式是谁发明的,只记得第一次接触Lambda表达式是在使用VS2008的时候,那就先认为是微软发明的吧。

Lambda表达式从我接触开始到现在变得越来越流行,Java8中开始支持、kotlin更是对C#,F#做了广泛的抄袭(C#曾几何时不也如此对待过Java嘛)。其实这都充分说明了,Lambda表达式的重要性。要搞清楚Lambda首先需要搞清楚委托。

委托:

假设现在我们要开发一个处理两个整数的程序(假设先处理相加操作)


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

public class Worker

    {

      /// <summary>

      /// 处理两个数

      /// </summary>

      /// <param name="a"></param>

      /// <param name="b"></param>

      /// <returns></returns>

      public int HandleTwoNumber(int a,int b)

      {

        return a + b;

      }

    }

static void Main(string[] args)

    {

      int a = int.Parse(Console.ReadLine());

      int b = int.Parse(Console.ReadLine());

 

      Worker worker = new Worker();

      int result = worker.HandleTwoNumber(a, b);

      Console.WriteLine(String.Format("Result:{0}", result));

 

      string p = Console.ReadLine();

}

如果一段时间后,我们需要它变更为减操作:


1

2

3

4

5

6

7

public class Worker

    {

      public int HandleTwoNumber(int a,int b)

      {

        return a - b;

      }

    }

虽然有a+b变为a-b的变化很微小,但后续此处可能面临多次变化(由减变为除.........)。有变化就应封装变化,此处我们可以将a与b的操作行为抽象出来,用什么抽象呢?委托


1

2

3

4

5

6

7

8

public class Worker

    {

      public delegate int TwoNumberHandleMethodDelegate(int x, int y);

      public int HandleTwoNumber(int a,int b)

      {

        return a + b;

      }

    }

public delegate int TwoNumberHandleMethodDelegate(int x, int y);此处用delegate标注,表明这是一个委托定义。如果去掉 delegate 再来观察该定义,你会发现这就是一个没有方法体的抽象方法。所以委托的含义即:与该抽象方法签名形式相同的方法的类型。委托就是一种你定义的新数据类型,它与int、class是一样的都是数据类型。int表示整数,只要是整数都可以赋值给 int型变量;TwoNumberHandleMethodDelegate则表示,接收两个int型参数并返回int型结果的这类方法,因此满足上述要求的方法都可赋值给TwoNumberHandleMethodDelegate类型的变量。

如此一来Worker代码可修改为:


1

2

3

4

5

6

7

8

public class Worker

    {

      public delegate int TwoNumberHandleMethodDelegate(int x, int y);

      public int HandleTwoNumber(int a, int b, TwoNumberHandleMethodDelegate handle)

      {

        return handle(a, b);

      }

    }

如此a、b的操作被封装起来,所有的变化均交由调用者来处理。此处的含义:HandleTwoNumber处理a、b两个整数,具体如何处理由 handle 实施。此时你可能会问,那如何来调用该方法呢?调用如下:


阅读剩余部分

相关阅读 >>

.net页面局部更新引发的思考

mes溯源方案追溯系统开发

.net winform实现在listview中添加progressbar的方法

基于.net平台常用的框架整理的详细介绍

介绍c#中的接口

c# 数组作为参数传递出现的问题解决

正则表达式抓取网页信息

c#实现身份证识别功能的图文代码详解

.net core 和 .net .framework 相比哪个速度快?

c#中关于多线程创建对象的示例分享

更多相关阅读请进入《csharp》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...