1.事件的概念
1)C#事件本质就是对消息的封装,用作对象之间的通信;发送方叫事件发送器,接收方叫事件接收器;
2)发送器不知道接收器的任何情况,但接收器有一个事件处理程序来处理这个事件(当事件发生时);那么发送器和接收器之间如何进行通信呢?用事件。
3)简单地来理解把事件理解成消息即可
2.事件的工作方式
1)事件是根据发布者或预定者模型设计的。
2)触发事件的类称为发布者;对事件做出响应的类将一个或多个方法添加到发布者的委托中,该类称为预订者。
3)当发布者调用委托时,也会调用预订者的方法。通过使用委托,发布者可以调用预订者的一个或多个方法,而无须了解方法的详细信息。
4)预订者也可以指定零个、一个或多个方法来响应发布者的事件,而无须了解事件的详细信息。大多数情况下,事件都会被预订者忽略,而且不会有与事件关联的方法。
5)预订者要了解的唯一内容就是发布者事件委托的参数签名。从本质上来说,事件都是单向的,它们不具有返回值,因此预订者不必考虑事件的返回值签名。
3.定义事件
[访问修饰符] event 委托名 事件名;
4.订阅事件
eventMe += new delegateMe(objA.Method);
5.通知订阅对象
if(condition)
{
eventMe();
}
6.事件示例
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace 事件
{
/// <summary>
/// 定义事件 广播者
/// </summary>
class Delegate
{
public delegate void delegateMe();
public event delegateMe NotifyEveryOne;
//通知订阅对象
public void Notify()
{
if(NotifyEveryOne!=null)
{
Console.WriteLine("触发事件");
NotifyEveryOne();
}
}
}
/// <summary>
/// 事件订阅者A
/// </summary>
class ClassA
{
public void DispMethod()
{
Console.WriteLine("Class A 已接到NotifyEveryOne 事件的通知!");
}
}
/// <summary>
/// 事件订阅者B
/// </summary>
class ClassB
{
public void DispMethod()
{
Console.WriteLine("Class B 已接到NotifyEveryOne 事件的通知!");
}
}
class TestEvents
{
[STAThread]
static void Main(string[] args)
{
//委托的对象
Delegate objDelegate = new Delegate();
//ClassA的对象
ClassA objClassA = new ClassA();
//ClassB的对象
ClassB objClassB = new ClassB();
//订阅事件
objDelegate.NotifyEveryOne+=new Delegate.delegateMe(objClassA.DispMethod);
objDelegate.NotifyEveryOne+=new Delegate.delegateMe(objClassB.DispMethod);
objDelegate.Notify();
}
}
}
7.简单应用
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace 事件_课堂练习
{
class Management
{
public void DeductSalary(Staff staff)
{
staff.salary -= 500;
}
public void DeductPerformanceMark(Staff staff)
{
staff.mark -= 10;
}
}
class Staff
{
public int salary=10000;
public int mark=100;
public delegate void DeductStaff(Staff staff);
public event DeductStaff NotifyStaff;
public void playGames()
{
if (NotifyStaff != null)
{
Console.WriteLine("罚款500扣十分,你的剩余工资分数为");
NotifyStaff(this);
}
}
}
class Program
{
static void Main(string[] args)
{
Management objManagement = new Management();
Staff objStaff = new Staff();
objStaff.NotifyStaff += new Staff.DeductStaff(objManagement.DeductSalary);
objStaff.NotifyStaff += new Staff.DeductStaff(objManagement.DeductPerformanceMark);
objStaff.playGames();
Console.WriteLine("{0} {1}",objStaff.salary,objStaff.mark);
}
}
}