C#事件

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);
        }
    }
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值