我理解的委托的作用是:一个对象中发生的事件,要在另一个对象中调用方法,这就需要一种技术在两个不同的对象之间进行信息传输,这就是委托的作用。一般来说,我们将产生事件的对象称为发布者,将处理事件的类称为订阅者。
接下来用一个简单的例子进行说明,这个例子中有两个不同的类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