zoukankan      html  css  js  c++  java
  • 委托(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         /// <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 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         /// <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来总结一下:

  • 相关阅读:
    JavaScript.how-to-debug-javascript
    iOS.mach_absolute_time
    Startup.国外新锐公司及其技术Blog
    Android.FamousBlogs
    iOS.PrototypeTools
    Android.API.Context.getFilesDir()
    Android.Tools.Ant
    Tools.OnlineAPIs
    Java.Class
    Android.StructureOfAndroidSourceCodeRootTree
  • 原文地址:https://www.cnblogs.com/mcgrady/p/6963530.html
Copyright © 2011-2022 走看看