委托

什么是委托?

委托是存有对某个方法的引用的一种引用类型变量。引用可在运行时被改变。委托特别用于实现事件和回调方法!

 

使用委托:

public delegate void MyDelegateDemo();
private void HelloWorld() { Console.WriteLine("Hello World"); } public void Print() { MyDelegateDemo myDelegateDemo; myDelegateDemo = HelloWorld; myDelegateDemo(); }

首先我们可以看出我们使用委托时:

第一步定义一个委托类型 

    public delegate void MyDelegateDemo();

第二步实例化委托

    MyDelegateDemo myDelegateDemo;

第三步定义一个跟委托类型相匹配的函数

        private void HelloWorld()        {            Console.WriteLine("Hello World");        }

第四步将函数交给委托实列

      myDelegateDemo = HelloWorld;

最后我们才能使用该委托!

 

说一说我对委托的理解:

比如你知道定义一个普通变量

int i;

这个变量i会在后续的方法中使用

比如说

      private void PrintInt(int i)        {            Console.WriteLine(i);        }

我们后续需要输出不同的值的时候,改变一下变量即可!

 

那么我们定义一个委托变量

 MyDelegateDemo myDelegateDemo;

和普通变量不同的是MyDelegateDemo类型是我们自己定义的类型而已。

使用

     private void PrintDelagate(MyDelegateDemo myDelegateDemo)        {            myDelegateDemo();        }

其实和普通变量使用方法一样而已!

而区别在于

普通变量存放的是不同的变量

而委托变量存放的是不同的方法

通过这个例子我们看出

 

      private void HelloWorld()        {            Console.WriteLine("Hello World");        }     public  void Print()        {            PritfDocument(HelloWorld);        }      private void PritfDocument(MyDelegateDemo myDelegateDemo)        {            Console.WriteLine("来到了打印店");            Console.WriteLine("打印的内容是");            myDelegateDemo();            Console.WriteLine("离开了打印店");        }

可以看到输出内容是:

 

 

 

简化

我们在使用委托的时候定义起来是不是很麻烦,觉得很烦,微软也想到了这一点!

所以Action和Func就出来了,这两个有什么区别呢?

两者的区别在于Action没有返回值,而Func有返回值!

 

那么我们就可以简化一下PritfDocument方法

   private void PritfDocument(Action myDelegateDemo)        {            Console.WriteLine("来到了打印店");            Console.WriteLine("打印的内容是");            myDelegateDemo();            Console.WriteLine("离开了打印店");        }

但是这样也很烦 我们还需要自己去定义一个方法呢!

 

所以我们使用匿名方法去掉这个步骤

      PritfDocument(delegate () { Console.WriteLine("Hello World"); }       private void PritfDocument(Action myDelegateDemo)        {            Console.WriteLine("来到了打印店");            Console.WriteLine("打印的内容是");            myDelegateDemo();            Console.WriteLine("离开了打印店");        });

那使用匿名方法让代码看起来不是那么的简洁,我们还能不能优化呢?

c#作为世界上最好的语言但是也是可以的!

使用Lambda来简化,

最后变成了


        PritfDocument(()=> Console.WriteLine("Hello World")); private void PritfDocument(Action myDelegateDemo) { Console.WriteLine("来到了打印店"); Console.WriteLine("打印的内容是"); myDelegateDemo(); Console.WriteLine("离开了打印店"); }

 

鸣谢:

https://mp.weixin.qq.com/s/KdstTGbUeIqo_7SIQK4ytg

 

posted @ 2022-07-18 17:37  春光牛牛  阅读(42)  评论(0编辑  收藏  举报