MST

星途 面试题库

面试题:C#中委托与事件处理机制 - 基础应用

请描述在C#中如何定义一个委托和一个基于该委托的事件。并编写一段简单代码,实现当事件触发时,调用多个方法。
32.7万 热度难度
编程语言C#

知识考点

AI 面试

面试题答案

一键面试
  1. 定义委托和事件
    • 在C#中,委托是一种类型,它定义了方法的签名,事件是基于委托的一种特殊成员。
    • 以下是定义委托和事件的示例代码:
// 定义委托
public delegate void MyEventHandler();
// 定义包含事件的类
public class MyEventPublisher
{
    // 定义事件,基于上面的委托
    public event MyEventHandler MyEvent;
}
  1. 编写实现事件触发调用多个方法的代码
using System;

// 定义委托
public delegate void MyEventHandler();
// 定义包含事件的类
public class MyEventPublisher
{
    // 定义事件,基于上面的委托
    public event MyEventHandler MyEvent;

    // 触发事件的方法
    public void RaiseEvent()
    {
        MyEvent?.Invoke();
    }
}

class Program
{
    // 方法1
    static void Method1()
    {
        Console.WriteLine("Method1被调用。");
    }

    // 方法2
    static void Method2()
    {
        Console.WriteLine("Method2被调用。");
    }

    static void Main()
    {
        MyEventPublisher publisher = new MyEventPublisher();
        // 订阅事件
        publisher.MyEvent += Method1;
        publisher.MyEvent += Method2;

        // 触发事件
        publisher.RaiseEvent();

        // 取消订阅事件(如果需要)
        publisher.MyEvent -= Method1;
        publisher.RaiseEvent();
    }
}

在上述代码中:

  • 首先定义了一个MyEventHandler委托,它没有参数和返回值。
  • MyEventPublisher类包含一个基于MyEventHandler委托的MyEvent事件。
  • RaiseEvent方法用于触发MyEvent事件。在触发事件时,使用?运算符来确保在事件有订阅者时才调用Invoke方法,避免空引用异常。
  • Main方法中,创建了MyEventPublisher的实例,并为MyEvent事件订阅了Method1Method2方法。当调用RaiseEvent方法时,这两个方法会依次被调用。之后,取消了Method1方法的订阅,再次调用RaiseEvent方法时,只有Method2方法会被调用。