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