要想技术有所提高,就是把有些问题真正的弄懂弄明白,我从事C#开发两年了,一直对事件委托等概念一知半解,有时候博客园上看看别的大牛的文章,看看懂了就过去了,时间长了又忘了,真正理解还是要自己动手弄些例子,搞懂这些概念,我写文章也是出于这个目的,希望和大家一块学习进步。
我还是拿经典的例子来说明:猫叫,老鼠跑,主人吵醒了。
我们用事件的方法来实现,把猫叫作为触发事件的方法,绑定在这个事件上的方法都会被触发。
先用网上大家的例子:
public class Cat
{
/// <summary>
/// 猫叫方法
/// </summary>
public void Miao()
{
Console.WriteLine("喵喵喵喵喵喵");
if (OnMiao != null)
OnMiao(this,EventArgs.Empty);
}
/// <summary>
/// 猫叫事件
/// </summary>
public event EventHandler OnMiao;
}
public class Master
{
public Master()
{
}
/// <summary>
/// 主人被叫醒了
/// </summary>
public void Wake()
{
Console.WriteLine("死猫叫啥叫,吵我睡觉!!!");
}
}
public class Mouse
{
public Mouse()
{
}
/// <summary>
/// 老鼠跑
/// </summary>
public void Run()
{
Console.WriteLine("猫来了,快跑!!!!");
}
}
客户端代码
class Program
{
static void Main(string[] args)
{
Cat cat = new Cat();
Mouse mouse = new Mouse();
Master master = new Master(); cat.OnMiao += delegate { mouse.Run(); };
cat.OnMiao += delegate { master.Wake(); }; cat.Miao();
} }
这个办法可以实现,猫叫,老鼠跑,主人醒。但如果我想拓展下呢,主人叫有好几只猫,每只猫叫的声音都不一样,主人吵醒后要知道哪只猫把他吵醒了。
现在我们改写Cat类
/// <summary>
/// 我们自定义事件数据
/// </summary>
public class CatEventArgs : EventArgs
{
public string CatName { get; set; }
}
public class Cat
{
/// <summary>
/// 定义事件委托
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
public delegate void CatEventHandler(object sender, CatEventArgs e);
public Cat()
{
}
/// <summary>
/// 猫叫
/// </summary>
public void Miao()
{
Console.WriteLine("喵喵喵喵喵喵");
if (OnMiao != null)
{
CatEventArgs catEventArgs = new CatEventArgs();
catEventArgs.CatName = "Tom";
OnMiao(this, catEventArgs);
}
}
/// <summary>
/// 猫叫完成事件
/// </summary>
public event CatEventHandler OnMiao;
}
客户端代码
class Program
{
static void Main(string[] args)
{
Cat cat = new Cat();
Mouse mouse = new Mouse();
Master master = new Master(); cat.OnMiao += cat_OnMiao;
cat.OnMiao += delegate { master.Wake(); }; cat.Miao();
} static void cat_OnMiao(object sender, CatEventArgs e)
{
Console.WriteLine(string.Format("{0}猫在叫",e.CatName));
}
}
这样就知道哪只猫叫了,关键是我们自定义了CatEventArgs,这个类继承了EventArgs,可以传递事件信息,自定义信息,并且自定义事件委托public delegate void CatEventHandler(object sender, CatEventArgs e);
自己的小例子,大牛勿笑;新的一年祝大家心想事成,更上一层楼
--每天有点进步