MST
星途 面试题库

面试题:C# 中委托与事件的基础区别

请阐述在 C# 中委托和事件的主要区别。从语法定义、使用场景、访问权限等方面进行说明,并举例展示两者不同的使用方式。
48.4万 热度难度
编程语言C#

知识考点

AI 面试

面试题答案

一键面试

语法定义

  • 委托:委托是一种类型,它定义了方法的签名,可将方法作为参数传递给其他方法。语法上,先声明委托类型,再实例化委托并关联具体方法。例如:
// 声明委托
public delegate void MyDelegate(string message); 

public class Program
{
    // 定义与委托签名匹配的方法
    public static void PrintMessage(string message)
    {
        Console.WriteLine(message);
    }

    public static void Main()
    {
        // 实例化委托
        MyDelegate del = new MyDelegate(PrintMessage); 
        del("Hello, World!"); 
    }
}
  • 事件:事件是基于委托的一种特殊成员,它本质上是对委托的封装。在类中声明事件时,使用 event 关键字。例如:
// 声明委托
public delegate void MyEventHandler(object sender, EventArgs e); 

public class MyPublisher
{
    // 声明事件
    public event MyEventHandler MyEvent; 

    public void OnMyEvent()
    {
        if (MyEvent != null)
        {
            MyEvent(this, EventArgs.Empty);
        }
    }
}

public class MySubscriber
{
    public void HandleEvent(object sender, EventArgs e)
    {
        Console.WriteLine("Event received!");
    }
}

public class Program
{
    public static void Main()
    {
        MyPublisher publisher = new MyPublisher();
        MySubscriber subscriber = new MySubscriber();

        // 订阅事件
        publisher.MyEvent += subscriber.HandleEvent; 

        publisher.OnMyEvent(); 
    }
}

使用场景

  • 委托:常用于需要将方法作为参数传递的场景,如回调函数、异步编程等。例如在 ThreadPool.QueueUserWorkItem 方法中,可传递一个委托来指定线程要执行的工作。
public static void ThreadWork(object state)
{
    Console.WriteLine("Thread is working with state: " + state);
}

public static void Main()
{
    WaitCallback callback = new WaitCallback(ThreadWork);
    ThreadPool.QueueUserWorkItem(callback, "Some state data");
}
  • 事件:主要用于实现发布 - 订阅模式,当某个特定事件发生时,通知所有感兴趣的对象(订阅者)。比如在图形用户界面编程中,按钮的点击事件,当按钮被点击时,通知所有注册了该点击事件的处理方法。

访问权限

  • 委托:委托实例在声明它的类外部可以被完全访问,包括修改委托所引用的方法列表(添加或移除方法)。
  • 事件:事件在类外部只能使用 +=-= 运算符来注册和注销事件处理程序,不能直接调用事件,也不能在类外部直接赋值。这限制了事件在类外部的操作,提高了封装性和安全性。

总结来说,委托更侧重于方法的传递和调用,而事件则是基于委托实现的一种更具封装性和适用于发布 - 订阅模式的机制。