using System; using System.Collections; namespace CS2026 { public delegate void SpeedChangedEventHandler(object source, SpeedChangedEventArgs e); public class SpeedChangedEventArgs : EventArgs { int _oldSpeed; int _newSpeed; public int OldSpeed { get { return _oldSpeed; } set { _oldSpeed = value; } } public int NewSpeed { get { return _newSpeed; } set { _newSpeed = value; } } } public class Car { SpeedChangedEventHandler _speedChangedEventHandler; object lockThis = new object(); int _speed = 0; public event SpeedChangedEventHandler SpeedChanged { add { lock (lockThis) { _speedChangedEventHandler += value; } } remove { lock (lockThis) { _speedChangedEventHandler -= value; } } } public virtual void OnSpeedChanged(int oldSpeed, int newSpeed) { SpeedChangedEventArgs e = new SpeedChangedEventArgs(); e.OldSpeed = oldSpeed; e.NewSpeed = newSpeed; if (_speedChangedEventHandler != null) _speedChangedEventHandler(this, e); } public int Speed { get { return _speed; } set { int oldSpeed = _speed; _speed = value; OnSpeedChanged(oldSpeed, _speed); } } static void Main(string[] args) { Car car = new Car(); car.Speed = 25; car.SpeedChanged += new SpeedChangedEventHandler(CarSpeedChanged); car.Speed = 50; car.SpeedChanged -= new SpeedChangedEventHandler(CarSpeedChanged); car.Speed = 75; } static void CarSpeedChanged(object source, SpeedChangedEventArgs e) { Console.WriteLine("Car speed changed from {0} to {1}", e.OldSpeed, e.NewSpeed); } } }