//------使用委托实现一个音乐播放器的功能呢。(模拟事件)-------//
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace 模拟事件
{
/// <summary>
/// 音乐播放器类
/// </summary>
public class MusicPlayer
{
//1.音乐开始后触发某些事件
public Action AfterPlayMusic;
//2.音乐停止前触发某些事件
public Action BeforeEndMusic;
/// <summary>
/// 开始播放音乐
/// </summary>
private void PlayMusic()
{
Console.WriteLine("开始播放音乐");
}
/// <summary>
/// 按下【播放】按钮实现播放音乐
/// </summary>
public void StartPlay()
{
PlayMusic();
if (AfterPlayMusic != null) //音乐开始播放后,判断这个委托是否为空,如果不为空就执行一些事件
{
AfterPlayMusic(); //这里就相当于一个事件
}
Thread.Sleep(3000);//让系统睡3秒钟(音乐播放时间)
}
/// <summary>
/// 音乐播放完毕
/// </summary>
public void EndMusic()
{
if (BeforeEndMusic != null) //音乐播放完毕之前,判断这个委托是否为空,如果不为空就执行一些事件
{
BeforeEndMusic();
}
Console.WriteLine("音乐播放完毕!");
}
}
//------------------------------------------------------------------//
class Program
{
static void Main(string[] args)
{
//现在我们来使用这个音乐播放器类
MusicPlayer mp3 = new MusicPlayer();
//给委托赋值
mp3.AfterPlayMusic = () =>
{
Console.WriteLine("加载歌词!");
Console.WriteLine("加载动感音符!");
};
//给委托赋值
mp3.BeforeEndMusic = () =>
{
Console.WriteLine("删除歌词!");
Console.WriteLine("停止动感音符!");
};
mp3.StartPlay(); //按下播放按钮,
mp3.EndMusic(); //音乐播放完毕
Console.ReadKey();
}
}
}
//-------------------但是这个委托实现音乐播放器也有很大的缺点,下面我们来看看改了最后一点点的代码(搞破坏)---------------------------//
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace 模拟事件
{
/// <summary>
/// 音乐播放器类
/// </summary>
public class MusicPlayer
{
//1.音乐开始后触发某些事件
public Action AfterPlayMusic;
//2.音乐停止前触发某些事件
public Action BeforeEndMusic;
/// <summary>
/// 开始播放音乐
/// </summary>
private void PlayMusic()
{
Console.WriteLine("开始播放音乐");
}
/// <summary>
/// 按下【播放】按钮实现播放音乐
/// </summary>
public void StartPlay()
{
PlayMusic();
if (AfterPlayMusic != null) //音乐开始播放后,判断这个委托是否为空,如果不为空就执行一些事件
{
AfterPlayMusic(); //这里就相当于一个事件
}
Thread.Sleep(3000);//让系统睡3秒钟(音乐播放时间)
}
/// <summary>
/// 音乐播放完毕
/// </summary>
public void EndMusic()
{
if (BeforeEndMusic != null) //音乐播放完毕之前,判断这个委托是否为空,如果不为空就执行一些事件
{
BeforeEndMusic();
}
Console.WriteLine("音乐播放完毕!");
}
}
//------------------------------------------------------------------//
class Program
{
static void Main(string[] args)
{
//现在我们来使用这个音乐播放器类
MusicPlayer mp3 = new MusicPlayer();
//给委托赋值
mp3.AfterPlayMusic = () =>
{
Console.WriteLine("加载歌词!");
Console.WriteLine("加载动感音符!\n\n");
};
//给委托赋值
mp3.BeforeEndMusic = () =>
{
Console.WriteLine("删除歌词!");
Console.WriteLine("停止动感音符!");
};
//现在我想搞点破坏....我不执行下面两段代码了
//mp3.StartPlay(); //按下播放按钮,
//mp3.EndMusic(); //音乐播放完毕
//既然我在上面给AfterPlayMusic和BeforeEndMusic这两个委托已经赋值了。我这里就直接执行这两个委托
mp3.AfterPlayMusic();
mp3.BeforeEndMusic();
Console.ReadKey();
}
}
}
//--------------使用事件来实现一个音乐播放器-------------------//
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace 模拟事件
{
/// <summary>
/// 音乐播放器类
/// </summary>
public class MusicPlayer
{
//1.音乐开始后触发某些事件
public event Action AfterPlayMusic; //事件相对委托的声明,其实就是多了一个event的关键字而已,用法也是一样的
//2.音乐停止前触发某些事件
public event Action BeforeEndMusic;
/// <summary>
/// 开始播放音乐
/// </summary>
private void PlayMusic()
{
Console.WriteLine("开始播放音乐");
}
/// <summary>
/// 按下【播放】按钮实现播放音乐
/// </summary>
public void StartPlay()
{
PlayMusic();
if (AfterPlayMusic != null) //音乐开始播放后,判断这个委托是否为空,如果不为空就执行一些事件
{
AfterPlayMusic(); //执行事件
}
Thread.Sleep(3000);//让系统睡3秒钟(音乐播放时间)
}
/// <summary>
/// 音乐播放完毕
/// </summary>
public void EndMusic()
{
if (BeforeEndMusic != null) //音乐播放完毕之前,判断这个委托是否为空,如果不为空就执行一些事件
{
BeforeEndMusic(); //执行事件
}
Console.WriteLine("音乐播放完毕!");
}
}
//------------------------------------------------------------------//
class Program
{
static void Main(string[] args)
{
//现在我们来使用这个音乐播放器类
MusicPlayer mp3 = new MusicPlayer();
//给事件赋值一个匿名方法(注册事件)
mp3.AfterPlayMusic += () =>
{
Console.WriteLine("加载歌词!");
Console.WriteLine("加载动感音符!\n\n");
};
//给事件赋值一个匿名方法(注册事件)
mp3.BeforeEndMusic += () =>
{
Console.WriteLine("删除歌词!");
Console.WriteLine("停止动感音符!");
};
mp3.StartPlay(); //按下播放按钮,
mp3.EndMusic(); //音乐播放完毕
Console.ReadKey();
}
}
}
//-----------------------------------下面我们来看看使用事件实现音乐播放器的时候,看我们能不能再搞破坏了--------------------//
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace 模拟事件
{
/// <summary>
/// 音乐播放器类
/// </summary>
public class MusicPlayer
{
//1.音乐开始后触发某些事件
public event Action AfterPlayMusic;
//2.音乐停止前触发某些事件
public event Action BeforeEndMusic;
/// <summary>
/// 开始播放音乐
/// </summary>
private void PlayMusic()
{
Console.WriteLine("开始播放音乐");
}
/// <summary>
/// 按下【播放】按钮实现播放音乐
/// </summary>
public void StartPlay()
{
PlayMusic();
if (AfterPlayMusic != null) //音乐开始播放后,判断这个委托是否为空,如果不为空就执行一些事件
{
AfterPlayMusic(); //这里就相当于一个事件
}
Thread.Sleep(3000);//让系统睡3秒钟(音乐播放时间)
}
/// <summary>
/// 音乐播放完毕
/// </summary>
public void EndMusic()
{
if (BeforeEndMusic != null) //音乐播放完毕之前,判断这个委托是否为空,如果不为空就执行一些事件
{
BeforeEndMusic();
}
Console.WriteLine("音乐播放完毕!");
}
}
//------------------------------------------------------------------//
class Program
{
static void Main(string[] args)
{
//现在我们来使用这个音乐播放器类
MusicPlayer mp3 = new MusicPlayer();
//给委托赋值
mp3.AfterPlayMusic += () =>
{
Console.WriteLine("加载歌词!");
Console.WriteLine("加载动感音符!\n\n");
};
//给委托赋值
mp3.BeforeEndMusic += () =>
{
Console.WriteLine("删除歌词!");
Console.WriteLine("停止动感音符!");
};
//现在我想搞点破坏....我不执行下面两段代码了
//mp3.StartPlay(); //按下播放按钮,
//mp3.EndMusic(); //音乐播放完毕
//既然我在上面给AfterPlayMusic和BeforeEndMusic这两个事件已经赋值了。我这里就直接执行这两个事件
//mp3.AfterPlayMusic(); //发现直接执在MusicPlayer类外面执行MusicPlayer类的AfterPlayMusic事件报错了
//mp3.BeforeEndMusic(); //发现直接执在MusicPlayer类外面执行MusicPlayer类的BeforeEndMusic事件报错了
//最后我们得出结论:
//1.当在一个类的内部定义了一个事件,那么事件在定义事件的类的外部不能直接调用
//2.当在一个类的内部定义了一个事件,那么事件只能在定义事件的类的内部触发(调用)
Console.ReadKey();
}
}
}
我们发现,我们不能搞破坏了。如果不按下播放按钮,音乐就不会开始。 也不会出现没有播放音乐就出现加载歌词,加载动感音符这种不合理的事情了