7.31 C#学习笔记(事件)
·
事件
事件:基于委托的,为委托提供一个发布/订阅的机制 ,可以说事件是一个具有特殊签名的委托。
事件关键字:event 是在委托上面加上关键字 ,加上之后在使用委托的时候会增加一些限制。
下面我们通过一个实例来认识事件:
题目:有一个懒人(LazyMan)类,它有一个名字(Name)属性,有两个方法TakeFood和GetFood分别执行"买饭"和"拿快递"。有一个工具人(ToolMan)类,它也有Name属性和一个"下楼"方法。创建事件,当工具人下楼时才能执行TakeFood和GetFood方法。
创建LazyMan类:
internal class LazyMan
{
public string Name { get; set; }
public LazyMan(string name)
{
this.Name = name;
}
public void TakeFood()
{
Console.WriteLine($"{Name}买饭");
}
public void GetFoot()
{
Console.WriteLine($"{Name}拿快递");
}
}
创建ToolMan类:
由以下代码可知,只有执行Down方法,工具人下楼,才能执行委托中的方法。
internal class ToolMan
{
public string Name { get; set; }
public ToolMan(string name)
{
Name = name;
}
public delegate void DownDelgate();
//event 是在委托上面加上关键字 加上之后在使用委托的时候会增加一些限制
public event DownDelgate downDelgate = null;
//调用事件的函数
public void Down()
{
Console.WriteLine($"{Name}下楼了");
downDelgate();
}
}
Main方法使用:
由代码可知,将实例化出来的对象中的方法订阅给为委托,调用Down方法是,事件触发,委托中的方法执行。
static void Main(string[] args)
{
// 事件
//基于委托的 为委托提供一个发布/订阅的机制 可以说事件是一个具有特殊签名的委托
//LazyMan L = new LazyMan("小明");
//L.TakeFood();
//LazyMan L1 = new LazyMan("小张");
//L1.GetFoot();
ToolMan T = new ToolMan("怨种");
LazyMan L1 = new LazyMan("小明");
LazyMan L2 = new LazyMan("小张");
LazyMan L3 = new LazyMan("小李");
LazyMan L4 = new LazyMan("小吴");
//订阅
T.downDelgate += L1.TakeFood;
T.downDelgate += L2.TakeFood;
T.downDelgate += L3.TakeFood;
//取消订阅
T.downDelgate -= L4.TakeFood;
//Console.WriteLine("怨种出发了");
//
//T.Down();
// 工具人还没下楼 委托的事件也发生了 这不合理
//这样写 直接调用委托 会发现 工具人还没有下楼就执行了操作 事件还没有执行 怎么解决? 事件
//T.downDelgate();
T.Down();
}
运行结果:

事件实例练习
题目:有个高档的热水器,包含一个加热器,一个报警器和一个现实屏,我们给热水器它通上电,当水温超过95度的时候:
// 1、报警器会开始发出语音,告诉你水的温度;
//2、液晶屏也会改变水温的显示,来提示水已经快烧开了。
定义一个Class1类创建事件:
internal class Class1
{
//创建了一个事件
public event Action<int> action;
public void Boilwater()
{
for (int i = 0; i <= 100; i++)
{
if (i >= 95)
{
action(i);
}
}
}
}
定义一个Xianshi类:
internal class Xianshi
{
public void ShowMsg(int param)
{
Console.WriteLine($"水温到了 当前水温{param}");
}
}
定义一个Baojing类:
internal class Baojing
{
public void MakeAi(int paras)
{
Console.WriteLine($"嘀嘀嘀:水已经{paras}");
}
}
Main函数调用:
static void Main(string[] args)
{
//有个高档的热水器,包含一个加热器,一个报警器和一个现实屏,我们给热水器它通上电,当水温超过95度的时候:
// 1、报警器会开始发出语音,告诉你水的温度;
//2、液晶屏也会改变水温的显示,来提示水已经快烧开了。
Class1 c1 = new Class1();
Xianshi c2 = new Xianshi();
Baojing c3 = new Baojing();
c1.action += c2.ShowMsg;
c1.action += c3.MakeAi;
c1.Boilwater();
}
运行结果:

更多推荐


所有评论(0)