C#:委托(delegate)与事件(event)

    我理解的委托的作用是:一个对象中发生的事件,要在另一个对象中调用方法,这就需要一种技术在两个不同的对象之间进行信息传输,这就是委托的作用。一般来说,我们将产生事件的对象称为发布者,将处理事件的类称为订阅者。

    接下来用一个简单的例子进行说明,这个例子中有两个不同的类BankCard(发布者)和Phone(倾听者),希望实现的作用是Card里每消费一笔钱(发生事件),Phone里就会显示出花了多少钱(方法),由于事件发生和处理方法分别是在两个不同的对象中,因此需要一个委托将其 联系起来。

    首先在Phone类里写出要处理事件的方法,在这里我们只需要显示花了多少钱

public class Phone
    {        
        public void Show(int money)
        {
            Console.WriteLine("本次消费{0}元!", money);            
        }
    }

    然后我们在命名空间中定义委托,委托跟方法的定义非常类似,只是增加了delagate关键词,减少了具体实现的代码块

public delegate void CostMoney(int money);
    注意委托和上面方法的参数类型和返回类型要保持一致。

    第三步要在BankCard类中声明事件

 public class BankCard
    {
        private int money;//消费的钱
        public int Money
        {
            get { return money; }
            set { money = value; }
        }

        public event CostMoney SpendMoney;  //声明事件
}

    具体来说是以下这句

public event CostMoney SpendMoney;  //声明事件

    该语句声明了一个名为SpendMoney的事件,每当发生该事件后,应该产生一个CostMoney委托

    第四步我们应该在BankCard类里写出一个抛出事件的方法。在类里添加下面代码

 //抛出事件
        public void Spend(int money)
        {
            Console.WriteLine("欢迎您购物!");

            if (SpendMoney != null)
            {
                SpendMoney(money);  //每次使用一个Spend函数都会抛出一次事件
            }
        }
    第五步,在主程序中建立事件与委托之间的联系。在主函数中添加下面代码
         //声明两个对象,因为事件和委托是发生在两个不同的对象之间,因此不能使用静态类
            BankCard myCard = new BankCard();
            Phone myPhone = new Phone();

            //建立事件和委托之间的联系
            myCard.SpendMoney += myPhone.Show;

            //调用方法产生事件
            myCard.Spend(20);

            Console.ReadKey();
    具体讲讲
myCard.SpendMoney += myPhone.Show;

    代码左边是事件,右边是发生事件后执行的方法,注意这里的方法名后面没有小括号()


    代码执行效果



完整的代码

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

namespace Try
{
    public delegate void CostMoney(int money);

    public class BankCard
    {
        private int money;//消费的钱
        public int Money
        {
            get { return money; }
            set { money = value; }
        }

        public event CostMoney SpendMoney;  //声明事件

        //调用事件
        public void Spend(int money)
        {
            Console.WriteLine("欢迎您购物!");

            if (SpendMoney != null)
            {
                SpendMoney(money);  //每次使用一个Spend函数都会产生一次事件
            }
        }
    }

    public class Phone
    {        
        public void Show(int money)
        {
            Console.WriteLine("本次消费{0}元!", money);            
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            //声明两个对象,因为事件和委托是发生在两个不同的对象之间,因此不能使用静态类
            BankCard myCard = new BankCard();
            Phone myPhone = new Phone();

            //建立事件和委托之间的联系
            myCard.SpendMoney += myPhone.Show;

            //调用方法产生事件
            myCard.Spend(20);

            Console.ReadKey();

        }

    
    }
}



博客参考:https://blog.csdn.net/xu_jin_shan/article/details/78066700

猜你喜欢

转载自blog.csdn.net/buaazyp/article/details/80756444