委托分为三种,分别是自己定义的delegate,Action, Func.
一、什么是委托?
委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法,可以避免在程序中大量使用If-Else(Switch)语句,同时使得程序具有更好的可扩展性。
其实委托就是方法而已,只不过他的参数也是一个方法。
二、委托的好处?为什么要学它?
网上,书上都说委托可以解决大量if else的问题,我看了例子,写的是排序的例子,利用委托搞了一个排序的规则,然而除了这个例子,其他的解决大量if else的场景我暂时想不到
所以目前我使用委托的时候,一个非常好的应用场景就是发布订阅模式,也就是设计模式里面的观察者模式.初学者学委托和我有一样的疑惑,委托有什么用?我直接调用不是也可以吗?
我为什么还要委托着调用?学习了发布订阅模式,你就明白委托的妙用了.在我的C#个人笔记博客里,有这个例子的介绍.
三、代码怎么敲?
delegate
特点:可以带返回值,也可以不带返回值。
代码:
第一种表达方式:
namespace 委托 { class Program { private delegate string MyDele(); //定义一个委托类型 static void Main(string[] args) { int x = 10; MyDele mydele = new MyDele(x.ToString); //创建委托实例,这里的x.ToString只是一个方法的引用,并没有调用这个方法
//MyDele mydele=x.ToString; 这段代码和上面那段是等价的
string s = mydele(); Console.WriteLine(s); Console.ReadKey(); } } }
第二种表达方式:
1 namespace 委托 2 { 3 class Program 4 { 5 private delegate void MyDele(); 6 private static void Print(MyDele print) //把委托类型当作参数使用了 7 { 8 print(); 9 } 10 11 static void math1() 12 { 13 Console.WriteLine("这是第一个方法"); 14 } 15 16 static void Main(string[] args) 17 { 18 19 MyDele mydele = math1; //为它赋初值 20 Print(mydele); 21 22 Console.ReadKey(); 23 } 24 } 25 26 }
Action
特点:没有返回值,最多可带16个参数。
代码:
1 namespace 委托 2 { 3 class Program 4 { 5 static void math() 6 { 7 Console.WriteLine("这是第一个方法"); 8 } 9 10 static void Main(string[] args) 11 { 12 Action vae = math; 13 vae(); 14 Console.ReadKey(); 15 } 16 } 17 18 }
Func
特点:有返回值,最多可带16个参数,前面是参数类型,最后一个是返回值类型。
代码:
1 namespace 委托 2 { 3 class Program 4 { 5 static int math(int i,int j) 6 { 7 return i+j; 8 } 9 10 static void Main(string[] args) 11 { 12 Func<int,int,int> vae = math; 13 Console.WriteLine(vae(3,5)); 14 Console.ReadKey(); 15 } 16 } 17 18 }