C#委托(delegate)

1.什么是委托

委托是存有对某个方法的引用的一种引用类型变量。什么意思泥?通俗地说,在现实生活中本应该由我们去做的事情因为种种原因我们做不了,所以会委托别人代替我们去完成。要委托的事情就是个方法,被委托人会去完成(引用)这个事情(方法)。

2.委托的声明

声明一个委托很简单,一般由关键字delegate+返回类型+委托名称+参数组成

public delegate void MyDel(string message);

3.委托的方法

委托的方法就是委托人让被委托人代替他做的事情,可以是个普通的方法,但是这个方法的返回值和参数必须和委托的返回值和参数类型一致,这就是所谓的签名

public  void saySomething(string words){
            Console.WriteLine(words);
            Console.ReadKey();
        }

为什么要签名一致?首先这是个规则,要想玩游戏就必须遵循规则;其次,被委托人一定是可以胜任这次委托的。假设张三委托李四去帮他收账(方法),前提是拿着账本(参数)去收账,张三希望李四能把钱(返回类型)收回来,但是如果李四是拿着棍子(参数)去收账的,到头来被人打了还要张三付医药费(返回类型)。这当然不是张三所希望的

4.委托的实例

通过new关键字来创建委托实例。怎么让委托实例和事件联系起来?实例化的时候把事件传递给实例。

 MyDel del=new MyDel(saySomething);

5.委托的调用

调用委托实例的时候,实例会指向委托的方法,并把参数传递给方法。所以最终的输出结果是“hello,tomorrow”。

del("hello,tomorrow!");

6.委托demo

1)情景模拟

故事的开始是这样的:屌丝A暗恋女神C已经很久了,但是太过于腼腆始终没有勇气去表白。好基友B就冒出来了,怂恿A去表白

B:屌丝A,赶紧去表白女神C呀,再不去的话,她就要成为男神X的女票了。

A:我。。。我。。。女神C太美了,我怕hold不住,一看到她我心跳就飙到180了

B:瞧你这出息,难怪还是个屌丝

A:我写了一封情书,要不你替我转交给女神C,我请你吃一个星期的黄焖鸡

基友B爽快地答应了,于是一场委托就开始了。

2)委托之情书风波

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace 委托
{
    class Program
    {
        static void Main(string[] args)
        {
            //实例化委托
            MyDel 基友B = new MyDel(sendLetter);
            //实例调用=》指向委托方法 sendLe
            基友B();
        }

        //定义一个委托事件   送情书
        public static void sendLetter()
        {
            Console.WriteLine("**********************************");
            Console.WriteLine("I love you 女神C");
            Console.WriteLine("**********************************");
            Console.ReadKey();
        }

    }
    delegate void MyDel();   

}

这里写图片描述

3)委托多播之礼物风波

A:基友B都三天过去了

B:耐心一点,心急吃不了热豆腐!

A:可是不会一点动静都没有吧

B:你想是不是你信中没表达清楚?

A: 怎么可能,哎呀,对了信上好象没有署名~~(>_<)~~

B: -> ->

A:看来还要再麻烦你啦,嘿嘿

于是A又重新写了一封情书,并且还给女神C准备了一份礼物,把信和礼物一起委托给B去转交给C。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace 委托
{
    class  ds
    {
        public static void Main(string[] args)
        {

            //实例化ds类
            ds 屌丝A = new ds();
            //实例化委托
            MyDel 基友B = new MyDel(屌丝A.sendLetter);
            基友B += 屌丝A.sendGift;
            基友B("屌丝A");
        }

        //定义一个委托事件   送情书
        public void sendLetter(string name)
        {
            Console.WriteLine("**********************************");
            Console.WriteLine("I love you 女神C" );
            Console.WriteLine("                  署名:"+name);
            Console.WriteLine("**********************************");

        }
        //送礼物
        public void sendGift(string name) {
            Console.WriteLine(name+"的礼物是仙人掌");
            Console.WriteLine("**********************************");
            Console.ReadKey();

        }

    }
    delegate void MyDel(string name);   

}

这里写图片描述

这个例子中,委托的方法并不是static类型的,要通过实例去调用。这个世界上有很多屌丝,把他们分为一类叫做ds,屌丝A只是其中的一员(一个实例)。A要委托的事情有两件:寄信(A.sendLetter)和送礼物(A.sendGift),这就是所谓的委托多播(委托做多件事情,但注意签名仍然要一致)

通过【+=】进行委托多播

待续~~

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值