一:利用委托實現的例子:
//定義一個委托類型
public delegate void DoSthDelegate1();
///
/// 蘋果mp3播放器
///
class iPod
{
//在iPod類中定義一個委托變量
public DoSthDelegate1 userDo;
public void PlayMusic()
{
Console.WriteLine("開始播放音樂.....^^^^^^^^^^^^^^^^^^^^^^^^^........");
if (userDo != null)
{
//當一開始播放音樂就觸發userDo()這個動作。 調用委托變量 而委托變量的具體賦值是在主程序中
userDo();
}
Console.WriteLine("開始播放音樂.....#########################.........");
}
public void Stop()
{
Console.WriteLine("停止播放.");
//userDo();
}
public void Next()
{
Console.WriteLine("播放下一首...");
}
}主程序:
static void Main(string[] args)
{
#region 通過委托來實現的
iPod pod = new iPod();
pod.userDo = BlinkBackground;
//調用音樂開始播放的方法。
pod.PlayMusic();
//可以隨意將之前用戶已經綁定的方法給覆蓋掉。
//pod.userDo = ShowLrc;
//明明沒有播放音樂,卻可以觸發userDo。 這裡就是冒充了發生 因此引入了事件
//pod.userDo();
#endregion
static void ShowLrc()
{
Console.WriteLine("今天是個好日子,.今天是個好日子,今天是個好日子,今天是個好日子,.........");
}
static void BlinkBackground()
{
Console.WriteLine("閃閃閃.....");
}
}
二:通過事件來實現
//定義一個委托。
public delegate void DoSthDelegate2();
class iPod2
{
//定義了一個事件。
//定義事件的時候必須通過委托,沒有委托就無法定義事件。
public event DoSthDelegate2 MusicPlaying;
public void PlayMusic()
{
Console.WriteLine("開始播放音樂.....^^^^^^^^^^^^^^^^^^^^^^^^^........");
if (MusicPlaying != null)
{
//依然是在音樂開始播放的時候觸發了該動作。 調用事件變量
MusicPlaying();
}
Console.WriteLine("開始播放音樂.....#########################.........");
}
public void Stop()
{
Console.WriteLine("停止播放.");
}
public void Next()
{
Console.WriteLine("播放下一首...");
}
}主程序:
static void Main(string[] args)
{
#region 通過事件來實現的效果
iPod2 pod2 = new iPod2();
//事件不能用=直接賦值,也就避免了通過=將前面的所有內容直接覆蓋掉。
pod2.MusicPlaying += new DoSthDelegate2(BlinkBackground);
pod2.PlayMusic();
//事件不能再類外部觸發,只能在類內部觸發
//避免了向委托一樣,在外部冒充事件觸發。 這樣直接調用是不可能的
// pod2.MusicPlaying();
pod2.MusicPlaying += new DoSthDelegate2(pod2_MusicPlaying); //添加事件
pod2.MusicPlaying -= pod2_MusicPlaying; //刪除事件
#endregion
Console.ReadKey();
}
static void pod2_MusicPlaying()
{
throw new NotImplementedException();
}
static void ShowLrc()
{
Console.WriteLine("今天是個好日子,.今天是個好日子,今天是個好日子,今天是個好日子,.........");
}
static void BlinkBackground()
{
Console.WriteLine("閃閃閃.....");
}
}1.“委托”是一種數據類型,他可以存儲的是方法。
2.“事件”是一個對象,可以理解為對委托變量的封裝,事件的內部用的是委托實現的。
3.事件被編譯成為一個add_method()和remove_method()方法和一個私有的委托變量。
4.定義的事件變量不可以在所定義類的外部調用,防止了再外部冒充事件的觸發。
5.委托的作用其實是用來占位的,使用一個委托變量來代替方法的調用,在實際調用之前需要給委托變量賦值,否則為null。
6.事件的作用與委托一樣,只是在功能上比委托變量有更多的限制。