简单例子快速了解事件处理和委托 event delegate

本文详细介绍了在C#中使用事件处理和委托的原理与实践,通过简单的实例展示了如何创建、触发和响应事件,以及如何利用事件处理和委托实现组件之间的交互。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

以下仅仅是用最简单的方式表示事件,实际应用可能是不同窗体之间相互通知某些操作,达到触发。

首先声明一个degate的 EventHandler 参数可以没有 一个或多个 但是触发和使用一定要匹配。

创建一个该EvenHandler的实例a

在程序建立或你需要的时候产生一个事件触发申明

a += new EventHandler(d);

public delegate void EventHandler(string s);

实际触发事件a("")

就可以调用实际操作。

        public event EventHandler a;

        public Form1()
        {
            InitializeComponent();
            // 声明事件触发
            a += new EventHandler(d);
        }
        private void button1_Click(object sender, EventArgs e)
        {
            MessageBox.Show("即将引发事件!");
            //触发
            a("ss");
            MessageBox.Show("11");
        }
        //实现
        public void d(string s)
        {
          // System.Threading.Thread.Sleep(10000);
            MessageBox.Show("d."+s);
        }


<think>我们首先需要理解委托Delegate事件(Event)在C#中的作用。 委托Delegate)是一种类型,它表示对具有特定参数列表返回类型的方法的引用。它类似于C++中的函数指针,但委托是面向对象、类型安全可靠的。 事件(Event)是基于委托的,为类的实例提供通知的一种方式。事件是类在发生某些事情时通知其他类或对象的机制。 接下来,我们将通过一个示例来展示委托事件的使用。我们将创建一个简单的场景:一个温度监控器,当温度超过某个阈值时触发事件。 步骤: 1. 定义一个委托类型,用于表示事件处理方法的签名。 2. 声明一个事件,该事件使用上面定义的委托类型。 3. 创建一个触发事件的方法(例如,当温度变化时检查阈值)。 4. 编写事件处理方法,当事件被触发时执行。 5. 将事件处理方法订阅到事件上。 代码示例:</think>### C#中的委托Delegate事件(Event委托事件是C#实现回调机制观察者模式的核心技术。委托是类型安全的函数指针,事件是基于委托的发布-订阅机制。 #### 委托基础 委托是定义方法签名的类型,可以引用任何匹配签名的方法: ```csharp // 1. 声明委托类型 public delegate void MessageHandler(string message); class Program { // 2. 创建委托实例 static void Main() { // 绑定静态方法 MessageHandler handler1 = PrintToConsole; // 绑定实例方法 var logger = new FileLogger(); MessageHandler handler2 = logger.LogToFile; // 多播委托(组合多个方法) MessageHandler multiHandler = handler1 + handler2; // 3. 调用委托 multiHandler("委托调用测试!"); } static void PrintToConsole(string msg) { Console.WriteLine($"控制台: {msg}"); } } class FileLogger { public void LogToFile(string msg) { File.AppendAllText("log.txt", $"{DateTime.Now}: {msg}\n"); } } ``` #### 事件实现 事件是特殊的多播委托,提供受控的发布-订阅机制: ```csharp // 温度监控系统示例 public class TemperatureSensor { // 1. 定义事件(基于委托) public event EventHandler<TemperatureChangedEventArgs> TemperatureChanged; // 2. 触发事件的方法 public void UpdateTemperature(double newTemp) { Console.WriteLine($"温度更新: {newTemp}°C"); OnTemperatureChanged(new TemperatureChangedEventArgs(newTemp)); } // 3. 事件触发封装方法 protected virtual void OnTemperatureChanged(TemperatureChangedEventArgs e) { TemperatureChanged?.Invoke(this, e); // 安全调用 } } // 自定义事件参数 public class TemperatureChangedEventArgs : EventArgs { public double NewTemperature { get; } public TemperatureChangedEventArgs(double newTemp) { NewTemperature = newTemp; } } // 事件订阅者 public class TemperatureMonitor { public TemperatureMonitor(TemperatureSensor sensor) { // 4. 订阅事件 sensor.TemperatureChanged += HandleTemperatureChange; } // 5. 事件处理方法 private void HandleTemperatureChange(object sender, TemperatureChangedEventArgs e) { Console.BackgroundColor = e.NewTemperature > 35 ? ConsoleColor.Red : ConsoleColor.Green; Console.WriteLine($"警报: 当前温度 {e.NewTemperature}°C"); Console.ResetColor(); } } // 使用示例 class Program { static void Main() { var sensor = new TemperatureSensor(); var monitor = new TemperatureMonitor(sensor); // 模拟温度变化 sensor.UpdateTemperature(25); sensor.UpdateTemperature(32); sensor.UpdateTemperature(38); // 触发警报 } } ``` #### 关键概念解析 1. **委托核心特性**: - 类型安全:只能绑定匹配签名的方法 - 多播能力:支持`+=``-=`操作符组合多个方法 - 异步调用:通过`BeginInvoke/EndInvoke`支持异步 2. **事件核心特性**: - 封装性:外部只能`+=``-=`,不能直接调用或覆盖 - 空值安全:使用`?.Invoke()`避免空引用异常 - 事件参数:通过派生`EventArgs`传递事件数据 3. **委托 vs 事件**: | 特性 | 委托 | 事件 | |--------------|--------------------------|--------------------------| | 调用权限 | 公共可调用 | 仅声明类可触发 | | 多播支持 | 支持 | 支持 | | 空值检查 | 调用者需检查 | 封装空值检查 | | 典型用途 | 回调函数、Lambda表达式 | 观察者模式、UI事件处理 | #### 实际应用场景 1. **GUI事件处理**(WinForms/WPF): ```csharp button.Click += (sender, e) => MessageBox.Show("按钮被点击!"); ``` 2. **异步编程模式**: ```csharp public delegate void AsyncCallback(IAsyncResult ar); FileStream.BeginRead(buffer, 0, 1024, new AsyncCallback(ReadCompleted), null); ``` 3. **LINQ查询表达式**: ```csharp var result = data.Where(x => x > 10) // Lambda表达式本质是委托 .OrderBy(x => x); ``` 4. **跨线程UI更新**: ```csharp // WPF示例 Dispatcher.Invoke(() => textBox.Text = "更新后的文本"); ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值