转载

初入委托

一、什么是委托

委托,类似于C/C++中的函数指针,而在C#中没有函数指针的概念,但它引入了委托的概念,委托是一个引用类型,也可以将其理解为一种数据类型。也可以更通俗的理解:委托就是在运行时,可以将一个条件(委托参数)通过特殊途径(委托引用)得到一个结果(委托返回结果)。而委托在这里扮演的角色就是找到这个途径。

二、委托声明

委托声明取决于被委托引用的方法,委托必须与所引用的方法具有相同签名。   

三、委托调用

那么委托到底有什么用?什么时候该用委托呢?先看一段代码~~~

1.委托调用与函数调用

//定义一个返回值类型为Color 参数类型为TreeType 的委托  public delegate Color GetColorofTree(TreeType treeType);  public enum TreeType : uint { Apple, Maple, Ginkgo } //根据不同果树 返回不同的颜色   public static Color GetTreeColor(TreeType treeType)   {    switch (treeType)    {     case TreeType.Apple:      return Color.Green;     case TreeType.Maple:      return Color.Red;     case TreeType.Ginkgo:      return Color.Yellow;     default:      return Color.Green;    }   } 

我们定义了一个方法,可通过不同的果树得到不同的颜色。下面来使用委托。

//调用参数为委托类型的方法 static void GetColor(GetColorofTree color) {  Color c= color(TreeType.Apple);  Console.WriteLine("使用委托:{0}",c); } static void Main(string[] args)  {  /*===========================函数调用委托=====================================*/    GetColor(GetTreeColor);//使用委托    Color co = GetTreeColor(TreeType.Apple);//直接调用函数    Console.WriteLine("不使用委托:{0}",co); } 

我们新加了一个GetColor的方法,它的参数是以委托GetColorofTree为类型,在这里就是我们通俗的说,委托就是可以把一个函数当作参数传入另外一个函数。

看看结果:

初入委托

通过这个结果可以看到都得到了想要的结果 Green颜色。那么问题来了,既然使用委托和不使用委托的结果都相同,那么为什么要用委托呢,而且用委托还更麻烦,还要新加一个方法,而为什么不用GetTreeColor函数直接调用呢?

我们可以想想,这里只有一个“途径”——通过传入不同的树来得到不同的颜色,那如果我们要再加新的“途径”,通过传入不同的树得到其树叶的颜色,或其果实成熟果皮的颜色,果肉的颜色等等。。。 那么使用委托的好处就慢慢体现出来了。这么多的“途径”如果我们在运行之前不能确定要用哪个途径,那么我们就可以用委托了。委托的好处就是可以在程序运行时的时候帮你在众多“途径”中帮你找到一个你想要的“途径”。

2.关于委托的调用

 1 /*===========================委托引用方法=====================================*/  2   3              GetColorofTree handler = new GetColorofTree(GetTreeColor);  4              //handler(TreeType.Apple);  5              handler.Invoke(TreeType.Apple);  6               7             /*===========================匿名委托 .net 2.0=====================================*/  8             GetColorofTree hand = delegate(TreeType type)  9             { 10                 //委托引用的方法的实现部分 11                 switch (type) 12                 { 13                     case TreeType.Apple: 14                         return Color.Green; 15                     case TreeType.Maple: 16                         return Color.Red; 17                     case TreeType.Ginkgo: 18                         return Color.Yellow; 19                     default: 20                         return Color.Green; 21                 } 22             }; 23             hand.Invoke(TreeType.Apple); 24  25             /*===========================lamda表达式 .net 3.0=====================================*/ 26  27             Func<TreeType, Color> f = type => 28             { 29                 switch (type) 30                 { 31                     case TreeType.Apple: 32                         return Color.Green; 33                     case TreeType.Maple: 34                         return Color.Red; 35                     case TreeType.Ginkgo: 36                         return Color.Yellow; 37                     default: 38                         return Color.Green; 39                 } 40             }; 41             f(TreeType.Apple);

上面代码例举了三种委托的调用方式,1、先实例化一个委托,然后使用委托调用,2、匿名委托(匿名方法),3、lamda表达式。若用匿名委托和lamda表达式调用委托,GetTreeColor方法和委托的声明就都不需要了。

=====================================================================================================

以上观点仅为个人理解,如有错误请指正~~~

正文到此结束
Loading...