什么是托付
可以用两点归纳综合:
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 /// <summary>15 /// 问候16 /// </summary>17 /// <param name="name"></param>18 /// <param name="lang"></param>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 /// <summary>32 /// 中文问候33 /// </summary>34 /// <param name="name"></param>35 private static void ChineseHello(string name)36 {37 Console.WriteLine(string.Format("你好,{0}", name));38 }39 40 /// <summary>41 /// 英文问候42 /// </summary>43 /// <param name="name"></param>44 private static void EnglishHello(string name)45 {46 Console.WriteLine(string.Format("hello,{0}", name));47 }48 49 }50 51 /// <summary>52 /// 言语范例53 /// </summary>54 public enum Language55 {56 English,57 Chinese58 }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 /// <summary>18 /// 问候19 /// </summary>20 /// <param name="name"></param>21 /// <param name="myDel"></param>22 private static void Hello(string name, MyDel myDel)23 {24 myDel(name);25 }26 27 /// <summary>28 /// 中文问候29 /// </summary>30 /// <param name="name"></param>31 private static void ChineseHello(string name)32 {33 Console.WriteLine(string.Format("你好,{0}", name));34 }35 36 /// <summary>37 /// 英文问候38 /// </summary>39 /// <param name="name"></param>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来总结一下:
以上就是什么是托付?总结.net中主要的特征托付的细致内容,更多请关注ki4网别的相干文章!