C#中的delegate和event简单示例

本文详细介绍了C#中的事件机制,包括如何声明事件、调用事件、与事件挂钩等核心概念。通过一个简单的异步任务示例展示了事件的实际应用。

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

    C# 中的“事件”是当对象发生某些有趣的事情时,类向该类的客户提供通知的一种方法。事件最常见的用途是用于图形用户界面;通常,表示界面中的控件的类具有一些事件,当用户对控件进行某些操作(如单击某个按钮)时,将通知这些事件。比如在进行网络操作时,由于网络请求很耗时,因此网络请求应该为异步,调用者并不知道请求何时完成,因此就需要使用事件来注册回调函数,当网络请求完成时触发事件,从而执行对于的回调函数获取到请求的结果。

    但是事件未必只用于图形界面。事件为对象提供一种通常很有用的方法来发出信号表示状态更改,这些状态更改可能对该对象的客户很有用。事件是创建类的重要构造块,这些类可在大量的不同程序中重复使用。

    使用委托来声明事件。如果您尚未学习“委托教程”,您应先学习它,然后再继续。请回忆委托对象封装一个方法,以便可以匿名调用该方法。事件是类允许客户为其提供方法(事件发生时应调用这些方法)的委托的一种方法。事件发生时,将调用其客户提供给它的委托。

一般步骤:
  • 声明事件   若要在类内声明事件,首先必须声明该事件的委托类型(如果尚未声明的话,注意到事件和委托类型的名字是一样的)。
    public delegate void ChangedEventHandler(object sender, EventArgs e);
    

    委托类型定义传递给处理该事件的方法的一组参数。多个事件可共享相同的委托类型,因此仅当尚未声明任何合适的委托类型时才需要执行该步骤。

    接下来,声明事件本身。

    public event ChangedEventHandler Changed;
    

    声明事件的方法与声明委托类型的字段类似,只是关键字 event 在事件声明前面,在修饰符后面。事件通常被声明为公共事件,但允许任意可访问修饰符。

  • 调用事件   类声明了事件以后,可以就像处理所指示的委托类型的字段那样处理该事件。如果没有任何客户将委托与该事件挂钩,该字段将为空;否则该字段引用应在调用该事件时调用的委托。因此,调用事件时通常先检查是否为空,然后再调用事件。
    if (Changed != null)
    {
        Changed(this, e);
    
    }

    调用事件只能从声明该事件的类内进行。

  • 与事件挂钩   从声明事件的类外看,事件像个字段,但对该字段的访问是非常受限制的。只可进行如下操作:
    • 在该字段上撰写新的委托。
    • 从字段(可能是复合字段)移除委托。

    使用 += 和 -= 运算符完成此操作。为开始接收事件调用,客户代码先创建事件类型的委托,该委托引用应从事件调用的方法。然后它使用 += 将该委托写到事件可能连接到的其他任何委托上。

    // 添加"ListChanged"事件到List对象中
    List.Changed += new ChangedEventHandler(ListChanged);
    

    当客户代码完成接收事件调用后,它将使用运算符 -= 从事件移除其委托。

    // 移除该事件
    List.Changed -= new ChangedEventHandler(ListChanged);

简单示例 :

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

namespace delegateEventDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            Request req = new Request();
        }

        static void print(String msg)
        {
            System.Console.WriteLine(msg);
        }


        /// <summary>
        /// 调用异步任务的类
        /// </summary>
        class Request
        {
            public Request()
            {
                AsyncRequestDemo d = new AsyncRequestDemo();
                // 注册事件触发时的回调函数来接收结果
                d.addCompleted += d_addCompleted;
                // 模拟异步调用
                d.AsyncAdd(3, 8);
            }

            /// <summary>
            /// 异步调用的回调函数,通过事件传递回来参数
            /// </summary>
            /// <param name="result"></param>
            void d_addCompleted(int result)
            {
                print("计算结果为 : " + result);
            }

        }


        /// <summary>
        /// 被调用的类,包含事件和代理
        /// </summary>
        class AsyncRequestDemo 
        {

            // 代理与事件的类型名要一样
            public delegate void myAsyncAddDelegate(int result);
            // 与上面的代理同名的事件类型,在事件触发时会调用在main中的回调函数d_addCompleted()
            public event myAsyncAddDelegate addCompleted;

            /// <summary>
            /// 带参数的类型
            /// </summary>
            /// <param name="a">被加数a</param>
            /// <param name="b">被加数b</param>
            /// <returns></returns>
            public void AsyncAdd(int a, int b)
            {
                /*
                 * 假设这里是异步操作,当异步完成时,调用自身的addCompleted事件,并且传递结果作为参数,
                 * 这样在Request类中的对应回调函数就可以接收计算结果了。
                 */
                print(String.Format("**** 三八节快乐 **** 异步调用 AsyncAdd {0} + {1} ", a , b) );

                int result = a + b;
                // 将结果通过触发事件返回
                this.addCompleted(result);
            }

        }
    }
}

结果为 :


<think>好的,我现在需要帮助用户解决关于C#delegate关键字的发音问题。用户之前询问了C++C#的主要差异,现在转向C#的具体细节。首先,用户提到“delegate”的正确发音,我需要确认发音并提供相关信息。 首先,我需要回想一下“delegate”的标准发音。根据英语发音规则,这个词通常读作/ˈdɛlɪɡət/,重音在第一个音节。不过,可能在编程社区中有不同的习惯发音,我需要确认这一点。另外,用户可能还希望了解这个关键字的作用,以加深理解,所以应该简要说明delegate的用途,比如用于定义委托类型,类似于函数指针,支持事件回调等。 接下来,我需要检查之前的引用内容是否有相关信息。用户提供的引用中有提到C#的委托,例如引用[4]中提到“如何定义委托”,但并没有涉及发音。因此,主要需要依赖我的现有知识来回答,同时结合用户之前的问题,确保回答的一致性相关性。 用户可能还想知道发音是否有常见的错误,或者是否有官方来源支持该发音。虽然微软文档通常不会提供发音指南,但可以参考技术社区或教育资源的常见用法。例如,在英语教学中,delegate作为名词动词的发音可能不同,但在编程中作为关键字,通常采用名词的发音,即/ˈdɛlɪɡət/。 此外,用户的问题可能隐含对委托概念的理解需求,所以在回答发音后,简要解释委托的作用,可以帮助用户更好地记忆应用该术语。例如,可以提到委托用于事件处理异步编程,这是C#的重要特性之一。 需要确保回答结构清晰,首先明确发音,然后解释概念,最后可能提供示例或常见用法。同时,检查是否有相关的引用可以支持,但根据提供的引用,似乎没有直接相关的,所以主要依靠自身知识。 最后,生成相关问题,帮助用户进一步探索,比如委托与事件的关系,或者如何在代码中使用委托,以及发音是否有其他变体等。确保问题与用户当前的学习路径相关,促进深入理解。</think>### C# 中 `delegate` 关键字的正确发音与解释 #### **1. 发音说明** - **英语标准发音**:`delegate` 读作 **/ˈdɛlɪɡət/**(音标参考),重音在第一个音节,类似中文谐音 **“得乐-盖特”**(“得乐”快速连读,“盖特”轻声)。 - **编程社区常见读法**:开发者通常简化读为 **“得乐-盖特”** 或直接按字母拆分读作 **“D-E-LEGATE”**(类似单词“delete”但末尾为“gate”)。 #### **2. `delegate` 的作用** `delegate` 是 C# 中定义**委托类型**的关键字,本质是类型安全的函数指针,用于封装方法引用,支持事件、回调多播委托。例如: ```csharp public delegate void MyDelegate(string message); // 定义委托类型 ``` - **核心用途**: 1. **事件处理**(如按钮点击事件) 2. **异步编程**(如 `BeginInvoke`) 3. **回调机制**(将方法作为参数传递)[^4]。 #### **3. 发音对比与误区** - 易混淆词: - **delete**(删除):读作 /dɪˈliːt/(“迪-利特”),重音在第二音节。 - **delegate**(委托):重音在第一音节,避免读成“迪-乐盖特”。 - 常见错误:部分开发者误读为 **“迪-legate”**(受“delete”影响),但标准发音更接近 **“得乐-盖特”**。 --- ### **相关问题** 1. C# 中委托(`delegate`)与事件(`event`)的关系是什么? 2. 如何用 `delegate` 实现多播委托(一次调用多个方法)? 3. 为什么说委托是类型安全的函数指针?与 C/C++ 的函数指针有何区别? 如需进一步示例或解释,请随时追问!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值