初入委托

一、什么是委托

  委托,类似于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方法和委托的声明就都不需要了。

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

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

 

 

  

  

 

posted @ 2015-06-24 11:04  FancyYOYO  阅读(761)  评论(4编辑  收藏  举报