C# Event事件的用法。

本文通过一个股票价格变动的例子介绍了C#中的委托和事件的使用方式。定义了一个PriceChangedHandler委托,并创建了PriceChanged事件,当股票价格发生变化时触发此事件,通过事件处理器实现价格变动超过10%时的报警功能。

请参考这个地址,本人写的下面参考不大,当时看的B站视频,截图只是方便我自己回忆,请看如下地址
委托和事件这篇文章写的挺好,跟着写一遍就可以懂。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
针对于Broadcaster类型里面的代码,PriceChanged就相当于是委托。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

例子:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 事件event
{
    public delegate void PriceChangedHandler(decimal oldPrice,decimal newPrice);

    //用来传递消息
    public class PriceChangedEbentArgs : EventArgs
    {
        public readonly decimal LastPrice;
        public readonly decimal NewPrice;

        public PriceChangedEbentArgs(decimal lastPrice, decimal newPrice)
        {
            LastPrice = lastPrice;
            NewPrice = newPrice;
        }
    }


    public class Stock
    {
        string symbol;
        decimal price;
        public Stock(string symbol)
        {
            this.symbol = symbol;
        }

        public event EventHandler<PriceChangedEbentArgs> PriceChanged;

        protected virtual void OnPriceChanged(PriceChangedEbentArgs e)
        {
            PriceChanged?.Invoke(this,e);
        }

        public decimal Price
        {
            get { return price; }
            set
            {
                if (price == value) return;
                decimal oldPric = price;
                price = value;
                OnPriceChanged(new PriceChangedEbentArgs(oldPric,price));
            }
        }

    }

    class Program
    {
        public event PriceChangedHandler PriceChanged;

        static void Main(string[] args)
        {

            Stock stock = new Stock("MSFT");
            stock.Price = 120;
            stock.PriceChanged += stock_PriceChanged;
            stock.Price = 135;

            Console.ReadKey();

        }

        static void stock_PriceChanged(object sendr,PriceChangedEbentArgs e)
        {
            if ((e.NewPrice - e.LastPrice) / e.LastPrice > 0.1M) {
                Console.WriteLine("Alert,10% stock price increase!");
            }
            
        }
    }
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

C# 中,事件Event)是用于实现发布-订阅模式的核心机制之一,广泛用于处理异步编程、用户界面交互以及组件通信等场景。事件允许一个对象在某些状态发生变化时通知其他对象,而无需知道这些对象的具体实现。 ### 事件的基本概念 事件是基于委托(Delegate)的封装。委托定义了事件的签名,即事件发生时调用的方法的参数和返回类型。事件可以被订阅(使用 `+=` 操作符),也可以被取消订阅(使用 `-=` 操作符)。 ### 定义和使用事件 以下是一个简单的 C# 事件示例: ```csharp using System; public class EventPublisher { // 定义一个委托 public delegate void NotifyEventHandler(string message); // 定义一个事件 public event NotifyEventHandler Notify; // 触发事件的方法 public void RaiseEvent(string message) { Notify?.Invoke(message); } } public class EventSubscriber { public void OnNotify(string message) { Console.WriteLine($"Received notification: {message}"); } } class Program { static void Main() { EventPublisher publisher = new EventPublisher(); EventSubscriber subscriber = new EventSubscriber(); // 订阅事件 publisher.Notify += subscriber.OnNotify; // 触发事件 publisher.RaiseEvent("Hello, World!"); } } ``` 在这个例子中,`EventPublisher` 类定义了一个名为 `Notify` 的事件,`EventSubscriber` 类包含一个方法 `OnNotify`,该方法被注册为事件的处理程序。当 `RaiseEvent` 方法被调用时,所有订阅该事件的方法都会被触发。 ### 多播事件处理 C#事件支持多播,即一个事件可以绑定多个处理方法。这些方法会按照它们被添加的顺序依次执行。 ```csharp publisher.Notify += subscriber.OnNotify; publisher.Notify += (message) => Console.WriteLine($"Another handler: {message}"); publisher.RaiseEvent("Multi-cast event"); ``` ### 使用 `EventHandler` 和 `EventArgs` 在实际开发中,通常使用 .NET 提供的 `EventHandler` 和 `EventArgs` 类来定义事件。`EventArgs` 可以携带事件发生时的附加信息。 ```csharp public class CustomEventArgs : EventArgs { public string Message { get; set; } } public class EventPublisher { public event EventHandler<CustomEventArgs> CustomEvent; public void RaiseCustomEvent() { CustomEvent?.Invoke(this, new CustomEventArgs { Message = "Custom event raised." }); } } class Program { static void Main() { EventPublisher publisher = new EventPublisher(); publisher.CustomEvent += (sender, e) => { Console.WriteLine($"Custom event received: {e.Message}"); }; publisher.RaiseCustomEvent(); } } ``` ### 事件与线程安全 在多线程环境中,事件的订阅和触发需要考虑线程安全。通常可以使用锁(`lock`)或 `Interlocked` 类来确保线程安全的操作。 ```csharp private object lockObj = new object(); public void SafeRaiseEvent(string message) { lock (lockObj) { Notify?.Invoke(message); } } ``` ### 事件在实际开发中的应用 事件广泛应用于 GUI 编程(如 WPF、WinForms)、异步编程(如 `async/await`)、以及各种组件之间的通信。例如,在 WPF 中,按钮点击事件是通过事件机制实现的: ```csharp button.Click += (sender, e) => { MessageBox.Show("Button clicked!"); }; ``` ### 相关问题 1. C# 中委托和事件的区别是什么? 2. 如何在 C# 中实现线程安全的事件处理? 3. C# 中如何使用 `EventHandler` 和 `EventArgs`? 4. C# 事件如何支持多播?如何控制事件处理的顺序? 5. 在 WPF 或 WinForms 中,事件是如何与 UI 交互的?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值