关于.net 事件 抄书记录
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
Stock stock = new Stock("MSFT");
stock.Price = 120;
stock.PriceChanged += stock_PriceChanged;
stock.Price = 150;
Console.Read();
}
static void stock_PriceChanged(object sender, PriceChangerEventArgs e)
{
if (e.NewPrice>e.LasPrice)
{
Console.WriteLine(e.LasPrice);
}
}
}
public class PriceChangerEventArgs : EventArgs {
public readonly decimal LasPrice;
public readonly decimal NewPrice;
public PriceChangerEventArgs(decimal lastPrice, decimal newPrice)
{
LasPrice = lastPrice;
NewPrice = newPrice;
}
}
public class Stock {
string symbol;
decimal price;
public Stock(string symbol)
{
this.symbol = symbol;
}
public decimal Price {
get { return price; }
set {
if (price == value) return;
decimal oldPrice = price;
this.price = value;
OnPriceChanged(new PriceChangerEventArgs(oldPrice, price));
}
}
public event EventHandler<PriceChangerEventArgs> PriceChanged;
protected virtual void OnPriceChanged(PriceChangerEventArgs e)
{
PriceChanged?.Invoke(this, e);
}
}
}
记录
使用委托的时候,通常出现两个角色,一个广播,一个订阅者
广播这这个类型包含一个委托,广播这通过委托来决定什么时候进行广播
订阅者是方法目标的接受者,订阅者可以决定什么时候开始和结束监听。方法是通过委托上+=和-=。
一个订阅者不知道和不干预其他的订阅者
- 事件就是将上述模式正式化的一个语言特性
- 事件是一种结构,为了实现广播者订阅者模型,他只暴露了所需所需委托特性的一部分子集
- 事件的主要目的就是防止订阅者之间的相互干扰
声明事件
最简单的声明方式就是在委托前面加上event关键字
标准事件模式
- 为编写事件,.net定义了一个标准的模式
- System.EventArgs,一个预定义的框架类,除了静态的Empty属性之外,他没有其他成员
- EventArgs是为事件传递信息的类的基类。
为事件选择或定义委托
- 返回类型是void;
- 接受两个参数,第一个参数类型是Object,第二个参数类型是EventArgs的子类。第一个表示事件的广播者,第二个参数包含需要传递的信息。
- 名称必须以EventHandler结尾
Frameword定一一个委托System.EventHandler他满足上述规则。
public delegete void EventHandler (object souce,TEventArgs e) where TEventArgs:EventAgs;
可触发事件的方法
方法名必须和事件一致,前面加上On,接收一个EventArgs参数
文章来自 草根专栏 哔哩哔哩的事件讲解