C#委托事件的区别

简介: C#委托事件的区别

在C#中,委托(delegate)和事件(event)经常一起使用,但它们之间确实有一些基本的区别:

  1. 委托(Delegate):委托是一个引用类型,它可以引用一个或多个具有特定签名的方法。简单地说,你可以将其视为一个类型安全的函数指针。
  2. 事件(Event):事件基于委托来实现,但它添加了一层封装,使得对象的其他部分不能直接调用或修改事件,除非是那些声明了这个事件的类。事件通常用于在类之间通信,一个类可以发布一个事件,而其他类可以订阅这个事件。

示例代码

委托:

// 定义一个委托
public delegate void MyDelegate(string message);
public class MyClass
{
    // 使用委托
    public MyDelegate MyAction;
    public void TriggerAction()
    {
        MyAction?.Invoke("Triggered action!");
    }
}
public class Program
{
    public static void Main()
    {
        MyClass obj = new MyClass();
        obj.MyAction += DisplayMessage;
        obj.TriggerAction();
    }
    static void DisplayMessage(string message)
    {
        Console.WriteLine(message);
    }
}

事件:

public delegate void MyEventHandler(string message);
public class EventPublisher
{
    // 使用事件
    public event MyEventHandler MyEvent;
    public void RaiseEvent()
    {
        MyEvent?.Invoke("Event raised!");
    }
}
public class Program
{
    public static void Main()
    {
        EventPublisher publisher = new EventPublisher();
        publisher.MyEvent += OnMyEventOccurred; // 订阅事件
        publisher.RaiseEvent();
    }
    static void OnMyEventOccurred(string message)
    {
        Console.WriteLine(message);
    }
}

注意:

  • 在委托的例子中,我们可以直接访问和修改MyAction委托。
  • 在事件的例子中,我们不能直接访问或修改MyEvent事件(例如,不能直接调用或设置为null),但我们可以使用+=订阅事件和使用-=取消订阅事件。

这样,事件提供了更好的封装和控制,使外部代码不能直接调用或修改事件,除非是那些声明了这个事件的类。

目录
打赏
0
0
0
0
8
分享
相关文章
C#一分钟浅谈:.NET Core 与 .NET 5 区别
本文对比了 .NET Core 和 .NET 5,从历史背景、主要区别、常见问题及易错点等方面进行了详细分析。.NET Core 侧重跨平台支持和高性能,而 .NET 5 在此基础上统一了 .NET 生态系统,增加了更多新特性和优化。开发者可根据具体需求选择合适的版本。
120 7
C# 一分钟浅谈:UDP 与 TCP 协议区别
【10月更文挑战第8天】在网络编程中,传输层协议的选择对应用程序的性能和可靠性至关重要。本文介绍了 TCP 和 UDP 两种常用协议的基础概念、区别及应用场景,并通过 C# 代码示例详细说明了如何处理常见的问题和易错点。TCP 适用于需要可靠传输和顺序保证的场景,而 UDP 适用于对延迟敏感且可以容忍一定数据丢失的实时应用。
120 1
C#面:Server.UrlEncode、HttpUtility.UrlDecode的区别
通过上述详细的解释和实例分析,相信大家对 `Server.UrlEncode` 和 `HttpUtility.UrlDecode` 的区别有了更深刻的理解,并能在实际开发中灵活运用。
126 0
|
5月前
|
【捞底干货】C#中equals和==运算符的区别
【捞底干货】C#中equals和==运算符的区别
287 1
|
6月前
|
C#
C#一分钟浅谈:委托与事件的实现方式
本文详细介绍了C#编程中委托与事件的基础知识及应用场景。首先解释了委托的概念,包括定义与使用方法;接着介绍了事件这一基于委托的特殊类型,展示了如何在类中定义事件及跨类订阅与处理事件;最后讨论了常见问题如事件未处理异常、重复订阅及内存泄漏等,并提出了相应的解决方案。通过本文,读者将全面掌握委托与事件的使用技巧,提升应用程序的设计与开发水平。
225 7
|
6月前
|
C# 一分钟浅谈:接口与抽象类的区别及使用
【9月更文挑战第2天】本文详细对比了面向对象编程中接口与抽象类的概念及区别。接口定义了行为规范,强制实现类提供具体实现;抽象类则既能定义抽象方法也能提供具体实现。文章通过具体示例介绍了如何使用接口和抽象类,并探讨了其实现方式、继承限制及实例化差异。最后总结了选择接口或抽象类应基于具体设计需求。掌握这两者有助于编写高质量的面向对象程序。
216 5
全面掌握Unity游戏开发核心技术:C#脚本编程从入门到精通——详解生命周期方法、事件处理与面向对象设计,助你打造高效稳定的互动娱乐体验
【8月更文挑战第31天】Unity 是一款强大的游戏开发平台,支持多种编程语言,其中 C# 最为常用。本文介绍 C# 在 Unity 中的应用,涵盖脚本生命周期、常用函数、事件处理及面向对象编程等核心概念。通过具体示例,展示如何编写有效的 C# 脚本,包括 Start、Update 和 LateUpdate 等生命周期方法,以及碰撞检测和类继承等高级技巧,帮助开发者掌握 Unity 脚本编程基础,提升游戏开发效率。
256 0
|
7月前
|
C# 委托
C# 委托
66 0
C# 语法中级
本文介绍了C#语法中的多个中级主题,包括lambda表达式、匿名类型、匿名方法、异常处理、枚举器与迭代器以及可空类型。重点内容如下: - **Lambda表达式**:编译为私有方法,支持捕获外部变量和迭代变量。 - **匿名类型**:通过`var`关键字创建,可用于快速定义对象。 - **匿名方法**:无需命名的委托实现。 - **异常处理**:常见异常类型及`try..catch..finally`语句。 - **枚举器与迭代器** 这些特性增强了C#的灵活性和表达能力,适用于更复杂的编程场景。
76 0
|
4月前
|
C# 一分钟浅谈:Code Contracts 与契约编程
【10月更文挑战第26天】本文介绍了 C# 中的 Code Contracts,这是一个强大的工具,用于通过契约编程增强代码的健壮性和可维护性。文章从基本概念入手,详细讲解了前置条件、后置条件和对象不变量的使用方法,并通过具体代码示例进行了说明。同时,文章还探讨了常见的问题和易错点,如忘记启用静态检查、过度依赖契约和性能影响,并提供了相应的解决建议。希望读者能通过本文更好地理解和应用 Code Contracts。
75 3