这样可以免除客户端多调用事件的时候,每次都要写new xx(),再建一个xxx(object sender,EventArgs e)的方法的麻烦。
不过说起来,我觉得反正VS可以通过tab键自动感应帮我们建好这个方法,而且规范整齐,有何不好呢?
Car的代码同上一篇一样,只是客户端的代码加多了一行。
客户端:
using System;
using System.Collections;
using System.Linq;
using System.Text;
using System.Collections.Generic;
using System.Runtime.Serialization;
namespace TestCS
{
class Program
{
public static void Main(string[] args)
{
Car c = new Car();
c.Exploed+=new Car.CareExploedHandle<Car.CarEventArgs>(c_Exploed);
c.Exploed += delegate(object sender, Car.CarEventArgs e) { Console.WriteLine("annoymous method" + e.msg); };
for (int i = 0; i < 10; i++)
{
c.Accelerate(100);
}
}
static void c_Exploed(object sender, Car.CarEventArgs e)
{
Console.WriteLine(e.msg);
}
}
}
CAR:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace TestCS
{
public class Car
{
#region Properties and variables
private int maxSpeed = 500;
private string petName;
private int currentSpeed;
public string PetName
{
get { return petName; }
set { petName = value; }
}
public int CurrentSpeed
{
get { return currentSpeed; }
set { currentSpeed = value; }
}
#endregion
public delegate void CareExploedHandle<T>(object sender, T e);
public class CarEventArgs : EventArgs
{
public readonly string msg;
public CarEventArgs(string message)
{
this.msg = message;
}
}
//这里指定的类型
public event CareExploedHandle<CarEventArgs> Exploed;
bool isExploed=false;
public void Accelerate(int delta)
{
if (isExploed)
{
if (Exploed != null)
//这里不要指定类型,但是参数要传类型化的
Exploed(this, new CarEventArgs("Car is exploed"));
}
else
{
currentSpeed += delta;
Console.WriteLine("Current Speed is {0}", currentSpeed.ToString());
if (maxSpeed< currentSpeed)
isExploed = true;
}
}
}
}