c#委托与事件

委托

个人理解:是一个执行方法的类(这些方法返回值和参数列表一样)。

格式:使用delegate关键字。

注意:调用有返回值的方法,委托调用返回的值只是最后一个方法的值。

public delegate void MyDel(int a,int b);
class Program
{
    public void Add(int a,int b)
    {
      Console.WriteLine(a+b);
    }
    public void Sub(int a,int b)
    {
    Console.WriteLine(a-b);
    }
    public void Div(int a,int b)
    {
     Console.writeLine(a*1.0/b);
    }
    static void Main()
    {
     Program p=new Program();
     MyDel del;//创建委托
     del=p.Add;//给委托添加方法
     del+=p.Sub;
     del+=p.Div;
     del(3,2);//执行委托
     }
}

class Program
{
    public void Add(int a,int b)
    {
      Console.WriteLine(a+b);
    }
    public void Sub(int a,int b)
    {
    Console.WriteLine(a-b);
    }
    public void Div(int a,int b)
    {
     Console.writeLine(a*1.0/b);
    }
    static void Main()
    {
     Program p=new Program();
     MyDel del;//创建委托
     del=p.Add;//给委托添加方法
     del+=p.Sub;
     del+=p.Div;
     del(3,2);//执行委托
     }
}

事件

事件是一种特殊的委托。简单来说就是当收到某些行为触发的一系列行动称为事件,如老鼠看见猫被吓得逃跑,那么逃跑就是一个事件。

组成包括声明事件,订阅事件,发布事件。
 

delegate void Handler();//声明委托
class Wang
{
  public event Handler Marriage;//创建事件并发布
  public void DoEvent()
  {
   Console.WriteLine("我要结婚啦!");
   if(Marriage!=null)//判断事件是否为空
     Marriage();
  }
class First
{
  public void BlessingFirst()
   {
    Console.WriteLine("小王恭喜啊!早生贵子哦!");
   }
}
class Second
{
   public void BlessingSecond()
   {
    Console.WriteLine("百年好合!");
   }
}
class Program
{
   static void Main()
   {
    Wang w=new Wang();
    First f=new First();
    Second s=new Second();
    /*订阅事件*/ 
    w.Marriage+=f.BlessingFirst;
    w.Marriage+=s.BlessingSecond;
    s.DoEvent();
    }
}

代码示例2:

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

namespace ConsoleApplication1
{
    delegate void Hander(string name);//声明委托
    class Baoshe
    {
        public event Hander Subscribe;//创建事件并发布
        public void Newspaper(string name)
        {
            if (name == "中国青年报" || name == "古今武侠传奇")
                Subscribe(name);
            else
                Console.WriteLine("本报社没有发布"+"《"+name+"》"+"期刊");
        }
    }
   class People
   {
       public string Name { get; set; }
       public People(string name)
       {
           this.Name = name;
       }
       public void Receive(string mazName)
       {
           Console.WriteLine(Name+"说我接到一本"+mazName);
       }
   }
    class Program
    {
        static void Main(string[] args)
        {        
            People m = new People("小明");
            People h = new People("小红");
            People g= new People("小刚");
            People z = new People("小张");
            /*订阅事件*/
            Baoshe wu =new Baoshe();
            wu.Subscribe += m.Receive;
            wu.Subscribe += z.Receive;
            wu.Subscribe += g.Receive;
            wu.Newspaper("古今武侠传奇");
            Baoshe qi = new Baoshe();
            qi.Subscribe += h.Receive;
            qi.Subscribe += g.Receive;
            qi.Newspaper("中国青年报");
            Console.ReadKey();
        }
    }
}

注意:事件只有+=,委托的第一个方法是=。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值