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


当前第2页 返回上一页

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

private static int Add(int a, int b)

    {

      return a + b;

    }

 

    private static int Sub(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.TwoNumberHandleMethodDelegate method = new Worker.TwoNumberHandleMethodDelegate(Add);

      Worker worker = new Worker();

      int result = worker.HandleTwoNumber(10, 10,method);

       //int result = worker.HandleTwoNumber(10, 10, Sub);//简化版

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

 }

根据上面的程序可知,Main代码块为worker的调用者,作为调用者而言应该最清楚自己想要让woker做的工作。因此作为被调用者的worker而言,它只需要接收调用者Main给的a\b参数及执行Main定制的算法method,然后按照算法执行并返回结果即可。上面代码虽然简单,但其中的意义深远,随着编程时间的增加相信你的理解将越深刻。

委托变量在进行赋值时除了标准的方式,还可以进行简化:


1

2

3

4

5

Worker.TwoNumberHandleMethodDelegate method = new Worker.TwoNumberHandleMethodDelegate(Add);

      Worker worker = new Worker();

      int result = worker.HandleTwoNumber(10, 10,method);

//可简化为

// int result = worker.HandleTwoNumber(10, 10,Add);

编译器将自动检查Add是否符合 TwoNumberHandleMethodDelegate 的定义,如果符合允许直接将方法名赋值给委托变量。

匿名委托

通过上面的示例代码,我们很容易发现 TwoNumberHandleMethodDelegate method 变量被赋值为Add(Sub),因此在调用method(...)时相当于调用Add(.....)。这样一来就可以认为

method与Add完全等效,既然等效那是否可以直接将Add的定义内容赋值给method变量呢?答案是肯定的:


1

2

3

4

5

6

7

8

static void Main(string[] args)

    {

 

      Worker.TwoNumberHandleMethodDelegate method =private static int Add(int a, int b)

    {

      return a + b;

    };

}

但像上面这种生拉硬套是不行的,你还需要做修改。修改内容是:因为现在的代码处于Main方法中,访问修饰符去掉,同样static也应去掉;同时编译器知道你要给method赋值,那么要赋的这个值肯定满足返回类型为int的要求,所有int在此时就多余了去掉;因为赋值之后method就等效于Add,以后调用只要通过method变量就可完成,所有Add方法名不需要去掉。如此代码变为如下形式:


1

2

3

4

5

6

7

8

static void Main(string[] args)

    {

 

      Worker.TwoNumberHandleMethodDelegate method =  (int a, int b)

    {

      return a + b;

    };

}

经过上面的修改内容简化了很多,但method赋值的=右端是什么东西呢?此时编译器并不能正确识别这是一个方法,因为方法的定义需要满足包含:访问修身符、返回类型、方法名、参数列表、方法体五部分内容。虽然你心里清楚这是个简化了的方法,但是编译器不懂你的心.........,那没关系只要我们告诉编译器,后面的是个简化方法就可以了。


1

2

3

4

5

6

7

8

static void Main(string[] args)

    {

 

      Worker.TwoNumberHandleMethodDelegate method =  delegate(int a, int b)

    {

      return a + b;

    };

}

正如你所期望的那样,现在编译器已经知道了=右侧是你经过简化的方法;ok,现在可以正常赋值并使用了。

通过上面的定义我们发现,用delegate标注的简化方法没有一个像Add/Sub一样固定的名字。因此我们称这种方法叫匿名委托(我习惯称匿名方法)。

你可能还注意到该匿名委托定义完毕后就赋值给Main代码快中的局部变量method,因此当超出method的作用域后,该方法就再也没有机会调用了。这引出了匿名方法、匿名委托、匿名函数它们的最常见用法,即用来定义只需要使用一次的功能代码。

以上就是C#中委托和匿名委托的具体介绍的详细内容!

返回前面的内容

相关阅读 >>

c#如何使用libusbdotnet实现usb通信的示例详解

c#操作styline二次开发实现画线功能

关于c#如何实现的udp收发请求工具类的示例代码分析

详细了解在.net core 上运行的wordpress

c#如何计算传入的时间距离今天的时间差的实例分享

.net core mvc实现一个在线房间棋牌游戏微信支付和及时通讯的简易框架

.net安装framework出现报错的处理教程

c#如何利用filesystemwatcher控件实现的文件监控的具体示例分享

.net?framework?4.5?五个很棒的特性分享

c#中关于minutes与totalminutes的区别

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




打赏

取消

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

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

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

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

评论

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