扩大
缩小
  

04委托Delegate和事件Event

一、委托(Delegate)

委托是一个类,定义了方法的类型,使方法可以当作另一个方法的参数进行传递,这种将方法动态地赋给参数的做法,可以避免在程序中大量使用If-Else(Switch)语句,同时使得程序具有更好的可扩展性。
委托是一个安全的函数指针,.NET中的委托是类型安全的,委托会检测它所保存的函数引用是否和声明的委托匹配。
复制代码
 public delegate void MyDelegate(string message);


 internal class Program
 {
     public void ShowMessage(string message)
     {
         Console.WriteLine("Message: " + message);
     }

     static void Main(string[] args)
     {
            //1、实例化委托并绑定方法
            MyDelegate myDelegate = new MyDelegate(new Program().ShowMessage);
            //调用委托
            myDelegate("Hello, World!");

            //2、使用Func委托
            Func<int, int, int> add = (a, b) => a + b;
            //调用Func委托
            int result = add(5, 10);
            Console.WriteLine("Result: " + result);
            
            //3、使用Action委托
            Action<string> printMessage = (message) => Console.WriteLine("Message: " + message);
            //调用Action委托
            printMessage("Hello, Action!");
     }
 }
复制代码
内置的委托对象
Delegate  至少0个参数,至多32个参数,可以无返回值,也可以指定返回值类型
Func<>    可以接受0个至16个传入参数,必须具有返回值
Action<>  可以接受0个至16个传入参数,无返回值

二、事件(Event)

事件是一种特殊的委托,用于实现发布-订阅模式,允许对象在特定的情况下通知其他对象。
主要用于实现回调函数、处理用户界面交互等。
复制代码
// 定义事件委托
public delegate void MyEventHandler(object sender, EventArgs e);

// 定义包含事件的类
public class MyEventClass
{
    public event MyEventHandler MyEvent;

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

// 订阅事件的方法
public class EventSubscriber
{
    public void HandleEvent(object sender, EventArgs e)
    {
        Console.WriteLine("Event handled by EventSubscriber");
    }
}

internal class Program
{
    static void Main(string[] args)
    {
        // 使用事件
        MyEventClass myObject = new MyEventClass();
        EventSubscriber subscriber = new EventSubscriber();
        // 订阅事件
        myObject.MyEvent += subscriber.HandleEvent;
        // 触发事件
        myObject.RaiseEvent();
    }
}
复制代码

三、两者区别:

相同点:

  • 都基于委托: 事件本质上是一种特殊的委托,事件声明和使用都依赖于委托类型。
  • 都支持多播: 委托和事件都支持多个方法的绑定,可以同时调用多个方法。

不同点:

  • 语法和用途: 委托用于直接调用方法或实现回调,而事件更多用于实现发布-订阅模式,让对象在状态改变时通知其他对象。
  • 封装性: 事件具有更高的封装性,外部类不能直接调用触发事件的方法,而委托没有这种封装性。
  • 事件在类中声明,委托可在任何地方声明和使用。
posted @   风筝遇上风  阅读(8)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
历史上的今天:
2021-09-06 LADP认证接入
2021-09-06 Identity Server基础
点击右上角即可分享
微信分享提示