委托

委托分为三种,分别是自己定义的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 }
原文地址:https://www.cnblogs.com/yunquan/p/4923124.html