csyx4.2-事件

事件的拥有者

事件

事件的订阅者

事件处理器

+=事件订阅

事件的拥有者这个类型包含1个委托字段,事件的拥有者通过调用委托来决定什么时候进行广播

事件只暴露了所需的委托特性的部分子集

事件是委托类型字段的包装器

 

声明事件

在委托类型字段前面加上event关键字-简化声明的形式

 

事件在事件的拥有者类型的类体之外只能进行+=/-=操纵

也就是事件只能出现在+=/-=左边

而在事件的拥有者内部可以进行判空和触发

 

事件的完整声明形式

私有委托类型字段

事件

add-事件处理器的添加器

remove-事件处理器的移除器

EventArgs基类-为事件传递信息的类

自定义的xxxEventArgs要派生与EventArgs基类

 

 

自定义的xxxEventArgs类是根据所含有的信息进行命名,而不是所使用的事件???

xxxEventArgs类-为事件传递信息

通过属性/只读字段来暴露数据

 

为事件选择或定义委托-xxxEventHandler

返回类型为void

接收两个参数,第1个参数类型为object,而2个参数类型为EventArgs的子类

第1个参数表示事件的拥有者

第2个参数包含需要传递的信息

也可以不自己定义委托

使用EventHandler

此时需要使用as转换

 泛型的EventHandler

 

 

可以触发事件的方法

修饰符为protected

命名为On事件

接收1个EventArgs参数

 ex:

using System;
using System.IO;
using System.Threading;
namespace Demo
{
    //3事件订阅者
    class Test
    {
        static void Main()
        {
            //1事件拥有者
            Stock stock = new Stock("MSFT");
            stock.Price = 120;
            //2事件
            //4事件处理器
            //5订阅+=
            stock.PriceChanged += stock_PriceChanged;
            //触发事件
            stock.Price = 135;
        }
        //4事件处理器
        private static void stock_PriceChanged(object sender, PriceChangedEvnetArgs e)
        {
            if ((e.NewPrice - e.LastPrice) / e.LastPrice > 0.1M)
            {
                Console.WriteLine("Alert,10% stock price increase!");
            }
        }
    }
    //传递事件信息的类
    public class PriceChangedEvnetArgs:EventArgs
    {
        //readonly字段
        public readonly decimal LastPrice;
        public readonly decimal NewPrice;
        //ctor
        public PriceChangedEvnetArgs(decimal lastPrice,decimal newPrice)
        {
            this.LastPrice = lastPrice;
            this.NewPrice = newPrice;
        }
    }
    //1事件拥有者
    public class Stock
    {
        string symbol;
        //ctor
        public Stock(string symbol)
        {
            this.symbol = symbol;
        }
        //事件的简略声明
        public event EventHandler<PriceChangedEvnetArgs> PriceChanged;
        //触发事件
        protected virtual void OnPriceChanged(PriceChangedEvnetArgs e)
        {
            PriceChanged(this, e);
        }
        //属性
        private decimal price;
        public decimal Price
        {
            get { return price; }
            //触发事件
            set
            {
                if (price == value) return;
                decimal oldPrice = price;
                price = value;
                OnPriceChanged(new PriceChangedEvnetArgs(oldPrice, price));
            }
        }
    }
}

多线程场景下

测试/调用前,需要把委托赋给1个临时变量来避免线程安全相关的错误

非泛型的EventHandler 

 

 事件访问器-事件的完整声明

事件的完整声明

场景:

当类暴露大量event,但是大部分时候都只有少数的订阅者存在

 

 

事件的修饰符

virtual-可以被重写

abstract

sealed

static

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值