委托原来如此简单

什么是委托?

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

使用委托:

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

可以看到输出内容是:

5ce9b7243d122e088ef47f3f129ba3ea.png

简化

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

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

最后大家如果喜欢我的文章,还麻烦给个关注, 希望net生态圈越来越好!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值