C# 面试题 目录

C# 中事件 (event) 的概念和用法

推荐答案

-- -------------------- ---- -------
----- -------

------ ----- ------------
-
    -- ----
    ------ ----- ------------------------- --------

    -- -------
    ------ ---- ----------------- --------
    -
        --------------------- --- ----------------------
    -
-

-- --------
------ ----- ----------- - ---------
-
    ------ ------ ------- - ---- -

    ------ ------------------ --------
    -
        ------- - --------
    -
-

-- ------
------ ----- ---------------
-
    ------ ---- ---------------- ------- ----------- --
    -
        ------------------------- --------- --------------
    -
-

-- ----
------ ----- -------
-
    ------ ------ ---- ------
    -
        --- --------- - --- ---------------
        --- ---------- - --- ------------------

        -- ----
        ----------------- -- ---------------------

        -- ----
        ---------------------------- ---------
    -
-

本题详细解读

事件的概念

在C#中,事件(event)是一种特殊的委托(delegate),用于实现发布-订阅模式。事件允许一个对象(发布者)通知其他对象(订阅者)某些事情已经发生。事件通常用于实现观察者模式,使得对象之间的耦合度降低。

事件的声明

事件的声明通常包括以下几个部分:

  1. 事件委托类型:事件通常基于一个委托类型。这个委托类型定义了事件处理方法的签名。例如,EventHandler<TEventArgs> 是一个常用的泛型委托类型,TEventArgs 是事件参数的类型。

  2. 事件本身:使用 event 关键字声明事件。例如:

事件的触发

事件的触发通常在一个方法中进行。触发事件时,需要检查事件是否为 null,以避免在没有订阅者的情况下触发事件导致异常。例如:

事件的订阅

订阅事件是通过 += 操作符将一个事件处理方法添加到事件的委托链中。例如:

自定义事件参数

为了传递更多信息,可以定义一个继承自 EventArgs 的自定义事件参数类。例如:

-- -------------------- ---- -------
------ ----- ----------- - ---------
-
    ------ ------ ------- - ---- -

    ------ ------------------ --------
    -
        ------- - --------
    -
-

事件处理方法的签名

事件处理方法的签名必须与事件委托类型的签名匹配。例如,EventHandler<MyEventArgs> 委托类型要求事件处理方法有两个参数:object senderMyEventArgs e

示例代码解析

在示例代码中:

  1. EventExample 类定义了一个事件 MyEvent,并提供了一个触发事件的方法 RaiseEvent
  2. MyEventArgs 类是一个自定义的事件参数类,用于传递事件相关的数据。
  3. EventSubscriber 类包含一个事件处理方法 OnMyEvent,用于处理事件。
  4. Program 类中,创建了 EventExampleEventSubscriber 的实例,并通过 += 操作符订阅事件,最后触发事件并输出消息。

通过这种方式,C# 中的事件机制可以实现松耦合的对象间通信。

纠错
反馈