面试题答案
一键面试语法定义
- 委托:委托是一种类型,它定义了方法的签名,可将方法作为参数传递给其他方法。语法上,先声明委托类型,再实例化委托并关联具体方法。例如:
// 声明委托
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");
}
- 事件:主要用于实现发布 - 订阅模式,当某个特定事件发生时,通知所有感兴趣的对象(订阅者)。比如在图形用户界面编程中,按钮的点击事件,当按钮被点击时,通知所有注册了该点击事件的处理方法。
访问权限
- 委托:委托实例在声明它的类外部可以被完全访问,包括修改委托所引用的方法列表(添加或移除方法)。
- 事件:事件在类外部只能使用
+=
和-=
运算符来注册和注销事件处理程序,不能直接调用事件,也不能在类外部直接赋值。这限制了事件在类外部的操作,提高了封装性和安全性。
总结来说,委托更侧重于方法的传递和调用,而事件则是基于委托实现的一种更具封装性和适用于发布 - 订阅模式的机制。