要想技術有所提高,就是把有些問題真正的弄懂弄明白,我從事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);
自己的小例子,大牛勿笑;新的一年祝大家心想事成,更上一層樓
--每天有點進步