在c#中multicast委托实现一个通用的模式,目的是避免大量的手工代码,这个模式成为observer或者是publish-subscribe模式,它要应对这样一种情形:你需要将单一的事件通知(比如对象状态发生的一个变化)广播给多个订阅者。 下面以一个温度控制的例子,在这个假象的情形中,一个加热器(heater)一个冷却器(cooler)连接到一个自动调温器。 为了控制加热器和冷却器的打开和关闭,要向他们通知温度的变化,调温器自动将温度的变化发布给多个订阅者--也就是加热器和冷却器。 首先定义加热器(Herter) using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication1 { class Herter { public Herter(float temperature) {//构造函数 Temperature = temperature; } public float Temperature {//属性 get { return _Temperature; } set { _Temperature = value; } } private float _Temperature; public void onTemperatureChange(float newTemperature) { if (newTemperature > Temperature) { Console.WriteLine("Heater:关闭"); } else { Console.WriteLine("Heater:打开"); } } } } 在定义冷却器(cooler) using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication1 { class Cooler { public Cooler(float temperature) {//构造函数 Temperature = temperature;//初始化属性 } public float Temperature //属性 { get { return _Temperature; } set { _Temperature = value; }//给字段赋值 } private float _Temperature; public void onTemperatureChange(float newTemperature) { if (newTemperature > Temperature) { Console.WriteLine("Cooler:打开"); } else { Console.WriteLine("Cooler:关闭"); } } } } 在定义调温器 using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication1 { class Thermostat { //定义委托,定义了订阅者的方法的签名 public delegate void TemperatureChangeHandler(float newTemperature); //委托类型的属性,用来存储订阅者列表,注意:只需要一个委托字段即可存储所有订阅者 public TemperatureChangeHandler OnTemperatureChange { get { return _OnTemperatureChange; } set { _OnTemperatureChange = value; } } private TemperatureChangeHandler _OnTemperatureChange; public float CurrentTemperature { get { return _CurrentTemperature; } set { if(value!=CurrentTemperature) { _CurrentTemperature = value; OnTemperatureChange(value); //这个语句将温度的变化发布给冷却器和加热器对象,我们只是执行了一个调用,即可以向订阅者发出通知 } } } private float _CurrentTemperature; } } 最后是调用 class Program { static void Main(string[] args) { Thermostat thermostat = new Thermostat(); Herter heater = new Herter(60); Cooler cooler = new Cooler(80); string temperature; thermostat.OnTemperatureChange += heater.onTemperatureChange; thermostat.OnTemperatureChange += cooler.onTemperatureChange; Console.WriteLine("请输入温度"); temperature = Console.ReadLine(); thermostat.CurrentTemperature = int.Parse(temperature); Console.ReadKey(); } } 下来咱们看看结果吧