委托(1)认识委托

委托(1)认识委托

阅读目录

什么是委托

为什么要使用委托

委托的应用场景

委托是.net中非常重要的特性,自.net 1.x版本就包含了,委托在项目开发过程中应用得非常多,但是一直以来很多同学对其理解得不是非常清楚(也包括我,虽然做开发很多年了,可能很多地方不知不觉也使用到了委托,但是仍然不是很清楚),那么我会整理一个系列文章来总结和加深一下对委托的印象。

回到顶部

什么是委托

可以用两点概括:

1,最通俗的理解是,一个安全的'函数指针'。

2,本质上,委托是一个类(class)(可以通过IL证明如下图),并且委托包含的是具有相同方法签名相同返回值的多个方法。

委托的类图:

从上图我们可以得到几点信息,1,委托是一个类(class)。2,委托继承自System.MulticastDelegate类型。

回到顶部

为什么要使用委托

更通俗的说法是,使用委托能够带来什么好处。

下面通过一个小的例子来演示一下使用委托的好处。需求是,通过输入的name,控制台分别打印中文和英文的问候语。

不使用委托:

1 namespace DelegateDemo

2 {

3 class Program

4 {

5 static void Main(string[] args)

6 {

7 //通过输入的name,控制台分别打印中文和英文的问候语

8 Hello("麦子", Language.Chinese);

9 Hello("mcgrady", Language.English);

10

11 Console.ReadKey();

12 }

13

14 ///

15 /// 问候

16 ///

17 ///

18 ///

19 private static void Hello(string name, Language lang)

20 {

21 if (lang == Language.Chinese)

22 {

23 ChineseHello(name);

24 }

25 if (lang == Language.English)

26 {

27 EnglishHello(name);

28 }

29 }

30

31 ///

32 /// 中文问候

33 ///

34 ///

35 private static void ChineseHello(string name)

36 {

37 Console.WriteLine(string.Format("你好,{0}", name));

38 }

39

40 ///

41 /// 英文问候

42 ///

43 ///

44 private static void EnglishHello(string name)

45 {

46 Console.WriteLine(string.Format("hello,{0}", name));

47 }

48

49 }

50

51 ///

52 /// 语言类型

53 ///

54 public enum Language

55 {

56 English,

57 Chinese

58 }

59 }

不使用委托的时候,需要使用一个枚举Language来表示使用中文问候还是英文问候,并且还要进行if...else...的判断。

当可以直接传递方法的时候也许就简单多了,下面来看一下。

使用委托:

1 namespace DelegateDemo

2 {

3 //声明委托

4 delegate void MyDel(string name);

5

6 class Program

7 {

8 static void Main(string[] args)

9 {

10 //通过输入的name,控制台分别打印中文和英文的问候语

11 Hello("麦子", ChineseHello);

12 Hello("mcgrady", EnglishHello);

13

14 Console.ReadKey();

15 }

16

17 ///

18 /// 问候

19 ///

20 ///

21 ///

22 private static void Hello(string name, MyDel myDel)

23 {

24 myDel(name);

25 }

26

27 ///

28 /// 中文问候

29 ///

30 ///

31 private static void ChineseHello(string name)

32 {

33 Console.WriteLine(string.Format("你好,{0}", name));

34 }

35

36 ///

37 /// 英文问候

38 ///

39 ///

40 private static void EnglishHello(string name)

41 {

42 Console.WriteLine(string.Format("hello,{0}", name));

43 }

44

45 }

46 }

所以总结起来,委托带来的好处主要有以下几点:

1,省去了大量的 if...else...或switch... 的判断,使得程序更面向对象了。

2,解耦,程序更容易扩展。例子:Tracy.Proxy接口代理组件,记录xml日志和性能日志。

当然,这只是一个例子,目的是说明使用委托带来的好处,其实还有很多地方都使用到了委托,比如winform和webform的按钮click事件,Linq中的Func和Action委托等。

回到顶部

委托的应用场景

1,winform和webform的按钮click事件。

2,Linq中的Func和Action委托。

3,Tracy.Proxy接口代理组件

用XMind来总结一下:

相关推荐