委托,类似于C/C++中的函数指针,而在C#中没有函数指针的概念,但它引入了委托的概念,委托是一个引用类型,也可以将其理解为一种数据类型。也可以更通俗的理解:委托就是在运行时,可以将一个条件(委托参数)通过特殊途径(委托引用)得到一个结果(委托返回结果)。而委托在这里扮演的角色就是找到这个途径。
委托声明取决于被委托引用的方法,委托必须与所引用的方法具有相同签名。
那么委托到底有什么用?什么时候该用委托呢?先看一段代码~~~
//定义一个返回值类型为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函数直接调用呢?
我们可以想想,这里只有一个“途径”——通过传入不同的树来得到不同的颜色,那如果我们要再加新的“途径”,通过传入不同的树得到其树叶的颜色,或其果实成熟果皮的颜色,果肉的颜色等等。。。 那么使用委托的好处就慢慢体现出来了。这么多的“途径”如果我们在运行之前不能确定要用哪个途径,那么我们就可以用委托了。委托的好处就是可以在程序运行时的时候帮你在众多“途径”中帮你找到一个你想要的“途径”。
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方法和委托的声明就都不需要了。
=====================================================================================================
以上观点仅为个人理解,如有错误请指正~~~