事件
一、简介
//为什么要有事件?首先说说委托的不足,比如把委托对象在类中声明为private会怎样。 结果就是:委托变得毫无意义。声明委托的目的就是为了把它暴露在类的客户端进行方法注册,把它声明为private了,客户端对它根本就不可见。再看看把委托声明为public会怎样。 结果就是:在客户端可以对它进行随意的赋值等操作,破坏了对象的封装性。 这就好像类中包含一个字段string name时,如果需要对它进行访问,通常并不会直接将name字段声明为public,而是添加一个公共属性public string Name{get{return name;}} ;事件:它封装了委托类型的变量,相当于为委托类型量身定制的属性. 使得:在类的内部,不管声明它是public还是protected,它总是private的(反编译也可以看出)。 //在类的外部,只能注册“+=”和注销“-=”的访问限定符与声明事件时使用的访问限定符相同 ,不能使用
二、委托事件也是为了多态化。简单示例委托与事件的不同,都是委托变量,但是委托变量前面加一个event
委托实现:
public class MusicPlayer
{
//委托实现
//1.音乐开始播放后触发某个事件
public Action AfterStartedPlay;
////2.音乐停止播放之前触发某个事件
public Action BeforeMusicStop;
//事件实现
//1.音乐开始播放后触发某个事件
// public event Action AfterStartedPlay;
//2.音乐停止播放之前触发某个事件
//public enent Action BeforeMusicStop;
private void PlayMusic()
{
Console.WriteLine("开始播放音乐......");
}
/// <summary>
/// 按下【播放】按钮实现播放音乐
/// </summary>
public void StartPlay()
{
PlayMusic();
//当音乐开始播放以后触发该事件。
if (AfterStartedPlay != null)
{
AfterStartedPlay();
}
Thread.Sleep(2000);
}
/// <summary>
/// 音乐播放完毕!
/// </summary>
public void EndMusic()
{
//在音乐播放结束之前
if (BeforeMusicStop != null)
{
BeforeMusicStop();
}
Console.WriteLine("音乐播放完毕!!");
}
}
MusicPlayer mp3 = new MusicPlayer();
mp3.AfterStartedPlay = () =>
{
Console.WriteLine("加载歌词!!!");
Console.WriteLine("加载动感背景!!!!");
};
mp3.BeforeMusicStop = () =>
{
Console.WriteLine("删除歌词!!!!!!");
Console.WriteLine("停止动感背景!!!!!");
};
//委托可以用=直接赋值,可以将以前“注册”的方法都覆盖掉。
mp3.AfterStartedPlay = null;
mp3.BeforeMusicStop = null;
mp3.StartPlay();
mp3.EndMusic();
//因为是用委托来实现的,所以在外部可以随意调用触发
//此时,不能将委托变成private的,如果改成私有的,则也无法为委托变量赋值了。
//mp3.AfterStartedPlay();
//mp3.BeforeMusicStop();
Console.WriteLine("ok");
Console.ReadKey();
事件实现:
MusicPlayer mp3 = new MusicPlayer();
mp3.AfterStartedPlay += new Action(mp3_AfterStartedPlay);
mp3.BeforeMusicStop += new Action(mp3_BeforeMusicStop);
//mp3.StartPlay();
//mp3.EndMusic();
////事件在外部不能直接调用。。
////事件只能在定义事件的类的内部来触发。
//mp3.AfterStartedPlay();
//mp3.BeforeMusicStop();
Console.ReadKey();
//上面注册的2个方法
static void mp3_BeforeMusicStop()
{
Console.WriteLine("删除歌词....");
}
static void mp3_AfterStartedPlay()
{
Console.WriteLine("加载歌词。。。。。");
}
浙公网安备 33010602011771号