1.利用委托实现事件例子
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace ConsoleApplication4
{
class Program
{
static void Main(string[] args)
{
MusicPlayer mp3 = new MusicPlayer();
mp3.AfterStartedPlay = () =>
{
Console.WriteLine("加载歌词!!!");
Console.WriteLine("加载动感背景");
};
mp3.StartPlay();//播放音乐
mp3.BeforeMusicStop = ()=>{
Console.WriteLine("删除歌词!!!!");
Console.WriteLine("停止动感背景!!!");
};
mp3.EndMusic();//停止音乐
//mp3.AfterStartedPlay();
//mp3.BeforeMusicStop();//当把播放音乐mp3.StartPlay();和停止播放音乐mp3.EndMusic();注释,还是可以调用AfterStartedPlay();BeforeMusicStop();显然是不合理的。
Console.WriteLine("ok");
Console.ReadKey();
}
}
class MusicPlayer {
public Action AfterStartedPlay;//定义一个AfterStartedPlay委托
public Action BeforeMusicStop;//定义一个BeforeMusicStop委托
private void PlayMusic() {
Console.WriteLine("开始播放音乐。。。。。");
}
public void StartPlay() {
PlayMusic();
if (AfterStartedPlay != null) {
AfterStartedPlay();//播放音乐后要做的事
}
Thread.Sleep(2000);
}
public void EndMusic() {
if (BeforeMusicStop != null) {
BeforeMusicStop();//播放音乐完之前要做的事
}
Console.WriteLine("音乐播放完毕!");
}
}
}
2.使用事件实现
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace ConsoleApplication5
{
class Program
{
static void Main(string[] args)
{
MusicPlayer mp3 = new MusicPlayer();
mp3.AfterStartedPlay += new Action(AfterStartedPlay);
mp3.StartPlay();
mp3.BeforeMusicStop += new Action(BeforeMusicStop);
//事件在外部不能直接调用
//事件只能在定义事件的类的内部来触发
//mp3.AfterStartedPlay();//报错
// mp3.BeforeMusicStop();//报错
mp3.EndMusic();
Console.WriteLine("ok");
Console.ReadKey();
}
static void AfterStartedPlay() {
Console.WriteLine("加载歌词!!!");
Console.WriteLine("加载动感背景");
}
static void BeforeMusicStop() {
Console.WriteLine("删除歌词!!!!");
Console.WriteLine("停止动感背景!!!");
}
}
class MusicPlayer
{
public event Action AfterStartedPlay;//声明事件与声明委托变量特别像,就是在声明委托变量的前面加一个event关键字
public event Action BeforeMusicStop;//当加了event关键字后,委托变量就变成了一个事件。
private void PlayMusic()
{
Console.WriteLine("开始播放音乐。。。。。");
}
public void StartPlay()
{
PlayMusic();
//事件的触发和调用的时候与委托变量的使用一模一样
if (AfterStartedPlay != null)
{
AfterStartedPlay();
}
Thread.Sleep(2000);
}
public void EndMusic()
{
if (BeforeMusicStop != null)
{
BeforeMusicStop();
}
Console.WriteLine("音乐播放完毕!");
}
}
}