事件的拥有者
事件
事件的订阅者
事件处理器
+=事件订阅
事件的拥有者这个类型包含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