.net事件笔记

关于.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关键字

标准事件模式

  1. 为编写事件,.net定义了一个标准的模式
  2. System.EventArgs,一个预定义的框架类,除了静态的Empty属性之外,他没有其他成员
  3. EventArgs是为事件传递信息的类的基类。

为事件选择或定义委托

  1. 返回类型是void;
  2. 接受两个参数,第一个参数类型是Object,第二个参数类型是EventArgs的子类。第一个表示事件的广播者,第二个参数包含需要传递的信息。
  3. 名称必须以EventHandler结尾

Frameword定一一个委托System.EventHandler他满足上述规则。
public delegete void EventHandler (object souce,TEventArgs e) where TEventArgs:EventAgs;

可触发事件的方法

方法名必须和事件一致,前面加上On,接收一个EventArgs参数

文章来自 草根专栏 哔哩哔哩的事件讲解

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值