委托的特点:不管在哪都可以调用!(委托不安全)
委托与事件的区别:
委托可以看做是一种类型,可以在任意位置调用,因此是不安全的;(委托是用来给函数占位的,不知道到底要调用哪一个函数!)
事件本质上是一种【类型安全】的委托;功能上:1.只能通过+= -=来调用 2.只能在类的内部来调用
实际案例:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
namespace ConsoleApp1
{
class Class18
{
//委托的特点:不管在哪都可以调用!(委托不安全)
/*
委托与事件的区别:
委托可以看做是一种类型,可以在任意位置调用,因此是不安全的;(委托是用来给函数占位的,不知道到底要调用哪一个函数!)
事件本质上是一种【类型安全】的委托;功能上:1.只能通过+= -=来调用 2.只能在类的内部来调用
*/
static void Main(string args)
{
PlayMusic p = new PlayMusic("12121");
// 注册要执行的事件
p.DelPlayOver += P_DelPlayOver; //在类的外部可以注册这个事件,但是我们不能执行这个事件的!
//p.DelPlayOver(this, new EventArgs()); error:该事件只能通过+=, 或者-= 来调用!
//然后开始播放
p.PlaySongs();
Console.ReadKey();
}
//事件需要执行的函数(也就是委托所指向的函数)
private static void P_DelPlayOver(object sender, EventArgs e)
{
//触发的事件源就是PlayMusic
PlayMusic p = sender as PlayMusic;
Console.WriteLine(p.Name + "播放完毕!");
}
}
class PlayMusic
{
public event EventHandler DelPlayOver; //注册事件
public string Name { get; set; }
public PlayMusic(string name)
{
this.Name = name;
}
//播放音乐
public void PlaySongs()
{
int i = 1;
try
{
while (i <= 3)
{
Console.WriteLine("正在播放{0}, 已经播放了{1}次", this.Name, i);
i++;
Thread.Sleep(1000);
}
if (DelPlayOver != null)
{
//调用我的事件
EventArgs e = new EventArgs();
//事件只能在类的内部来调用,更安全些!
DelPlayOver(this, e);
}
}
catch (Exception)
{
throw;
}
}
}
}
评论
填写昵称与邮箱即可评论,无需登录。