分享

C# 委托原来如此简单

 F2967527 2022-06-14 发布于北京

什么是委托?

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

使用委托:

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('离开了打印店'); }

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多