每个.NET开发都应掌握的C#委托事件知识点

这篇具有很好参考价值的文章主要介绍了每个.NET开发都应掌握的C#委托事件知识点。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

上篇文章讲述了C#接口的知识点,本文将介绍C#委托事件知识点。C#作为.NET开发的核心语言之一,提供了丰富的特性来支持面向对象编程和事件驱动的模型。其中,委托和事件是C#中不可或缺的关键概念,每个.NET开发者都应该深入理解它们的作用和用法。委托和事件密不可分,所以本文将委托和事件的知识点一起介绍,并通过一些示例来帮助开发者更好地掌握这些重要的概念。

一、委托

委托让方法引用的灵活利用

1、委托的定义与使用

委托是一种数据类型,用于持有对一个或多个方法的引用。通过委托,你可以将方法作为参数传递给其他方法,实现回调机制,实现方法的动态调用。使用`delegate`关键字可以声明委托类型,并创建委托实例来绑定具体方法。

using System;
//定义一个委托
delegate int CalculatorDelegate(int a, int b);
class Calculator
{
    public int Add(int a, int b)
    {
        return a + b;
    }
    public int Subtract(int a, int b)
    {
        return a - b;
    }
}
class Program
{
    static void Main(string[] args)
    {
        Calculator calculator = new Calculator();
        // 声明委托实例,并绑定到 Add 方法
        CalculatorDelegate funDelegate = new CalculatorDelegate(calculator.Add);
        // 使用委托调用方法
        int result = funDelegate (5, 2);
        Console.WriteLine($"5 + 2 = {result}");
        // 将委托重新绑定到 Subtract 方法
        funDelegate = calculator.Subtract;
        // 使用委托调用不同的方法
        result = funDelegate(8, 6);
        Console.WriteLine($"8 - 6 = {result}");
    }
}

使用try.dot.net的测试结果:

2、委托的多播

委托不仅可以持有单个方法的引用,还可以用于多播,即将多个方法绑定到同一个委托实例。多播委托允许按顺序调用这些方法,实现一次触发多个方法的功能。

using System;
delegate void MyDelegate(); // 定义委托
class EventPublisher
{
    private MyDelegate eventHandlers; // 多播委托实例
    public void AddHandler(MyDelegate handler)
    {
        eventHandlers += handler; // 添加委托方法到多播链
    }
    public void RemoveHandler(MyDelegate handler)
    {
        eventHandlers -= handler; // 从多播链中移除委托方法
    }
    public void RaiseEvent()
    {
        Console.WriteLine("事件发布者正在引发事件...");
        eventHandlers?.Invoke(); // 调用多播链中的委托方法
    }
}
class Program
{
    static void Main(string[] args)
    {
        EventPublisher publisher = new EventPublisher();
        // 添加多个事件处理程序到多播链
        publisher.AddHandler(Method1);
        publisher.AddHandler(Method2);
        publisher.AddHandler(Method3);
        // 触发事件,调用多播链中的所有方法
        publisher.RaiseEvent();
        // 移除一个事件处理程序
        publisher.RemoveHandler(Method2);
        // 再次触发事件
        publisher.RaiseEvent();
        Console.ReadKey();
    }
    static void Method1()
    {
        Console.WriteLine("方法1运行.");
    }
    static void Method2()
    {
        Console.WriteLine("方法2运行.");
    }
    static void Method3()
    {
        Console.WriteLine("方法3运行.");
    }
}

输出结果:

3、 匿名方法与Lambda表达式

C# 2.0 引入了匿名方法,允许在没有显示声明方法的情况下传递代码块作为委托参数。而Lambda表达式则是C# 3.0 的新特性,提供了更简洁的语法来创建委托实例。.NET的ORM框架EF中有了Lambda表达式方便多了。

进化:委托-->匿名方法-->Lambda

案例:下面案例是委托匿名方法和Lambda表达式三种使用案例

using System;
using System.Linq;
delegate int MathOperation(int a, int b);
class Calculator
{
    public int Add(int a, int b)
    {
        return a + b;
    }
    public int Subtract(int a, int b)
    {
        return a - b;
    }
}
class Program
{
    static void Main(string[] args)
    {
        Calculator calculator = new Calculator();
        // 1、使用委托和实例方法 Add
        MathOperation operation1 = calculator.Add;
        int result1 = operation1(10, 5);
        Console.WriteLine($"用委托方法计算: 10 + 5 = {result1}");
        // 2、使用匿名方法进行减法运算
        //MathOperation  operation2 = delegate (int a, int b)
        Func<int,int,int> operation2 = delegate (int a, int b)//内置Func
        {
            return a - b;
        };
        int result2 = operation2(15, 7);
        Console.WriteLine($"用匿名方法计算: 15 - 7 = {result2}");
        // 3、使用 Lambda 表达式进行乘法运算
        //MathOperation operation3 = (a, b) => a * b;//委托变量
        Func<int,int,int> operation3 = (a, b) => a * b;//内置Func
        int result3 = operation3(8, 6);
        Console.WriteLine($"用Lambda计算: 8 * 6 = {result3}");
        Console.ReadKey();
    }
}
//欢迎关注公众号:DOTNET开发跳槽,领取海量面试题。
//加微信号xbhpnet入群交流.NET求职和技术

效果如下:

4、委托的BeginInvoke方法实现异步

委托的 BeginInvoke 方法和 EndInvoke 方法可以实现异步执行委托方法。这允许委托的方法在后台线程中执行,而不会阻塞当前线程。小编在之前的webform开发中遇到下载进度条卡死的问题就是用它解决的。

案例:

using System;
using System.Threading;

delegate void PrintDelegate(string message);
class Program
{
    static void PrintMessage(string message)
    {
        for (int i = 0; i < 10000; i++)
        {
            Console.WriteLine(message);
        }
    }
    static void Main(string[] args)
    {
        PrintDelegate print = PrintMessage;
        // 使用委托的 BeginInvoke 方法来异步执行方法
        IAsyncResult result = print.BeginInvoke("执行异步方法!", null, null);
        // 使用委托的 EndInvoke 方法获取异步操作结果
        print.EndInvoke(result);//这里不会卡死
        Console.WriteLine("Begin 后的方法");
        Console.ReadKey();
    }
}
//由于控制台不支持展示,大家可以自己研究一下。

二、事件

事件对象之间的松耦合通信

1、事件的定义与声明

事件是委托的一种特殊应用,用于实现发布-订阅模型。使用event关键字可以声明事件,并指定事件委托的类型。事件允许对象通知其他对象在特定情况下执行操作,实现松耦合的通信机制。

 //声名
 public event TemperatureChangeHandler TemperatureChanged;

2、事件的订阅与发布

订阅事件的类(事件订阅者)可以将其方法绑定到事件上,以便在事件触发时执行操作。事件的持有者(事件发布者)在适当的时机触发事件,调用事件委托,从而通知所有订阅者执行相应的操作。

案例:

using System;

// 定义事件发布者类
class EventPublisher
{
    // 声明事件委托
    public event EventHandler<string> MessageSent;
    // 触发事件的方法
    public void SendMessage(string message)
    {
        Console.WriteLine($"发送消息:{message}");
        OnMessageSent(message);
    }
    // 触发事件的保护方法
    protected virtual void OnMessageSent(string message)
    {
        MessageSent?.Invoke(this, message); // 调用事件
    }
}

// 定义事件订阅者类
class EventSubscriber
{
    public void Subscribe(EventPublisher publisher)
    {
        // 订阅事件
        publisher.MessageSent += HandleMessageSent;
    }
    public void Unsubscribe(EventPublisher publisher)
    {
        // 取消订阅事件
        publisher.MessageSent -= HandleMessageSent;
    }
    // 事件处理方法
    private void HandleMessageSent(object sender, string message)
    {
        Console.WriteLine($"接收到消息:{message}");
    }
}

class Program
{
    static void Main(string[] args)
    {
        EventPublisher publisher = new EventPublisher();
        EventSubscriber subscriber1 = new EventSubscriber();
        EventSubscriber subscriber2 = new EventSubscriber();
        // 订阅事件
        subscriber1.Subscribe(publisher);
        subscriber2.Subscribe(publisher);
        // 发布事件
        publisher.SendMessage("你好,订阅者们!");
        Console.WriteLine("取消一个订阅者的订阅...");
        // 取消订阅一个订阅者
        subscriber1.Unsubscribe(publisher);
        // 发布事件
        publisher.SendMessage("再次打个招呼!");

        Console.ReadKey();
    }
}

输出:

3、事件的安全性与封装

事件提供了一种封装机制,使得事件只能被持有者触发,而不会被外部随意调用。这样可以确保事件只在控制的范围内使用,增强代码的安全性和可维护性。

三、委托与事件的关系

事件是委托的一种特殊用法,用于实现发布者/订阅者模式,实现对象之间的松耦合通信。委托是一种通用的类型,用于引用方法并执行它们,而事件是委托的一种实现,允许对象订阅和响应特定情况的通知,从而促进模块化和可维护的代码设计。通过事件,对象可以在不直接依赖于其他对象的情况下,将重要信息传递给感兴趣的观察者。

下面将用一个案例来理解委托和事件

为了更好地理解委托和事件,我们可以以一个简单的温度监测系统为例。假设有一个温度监测器对象,当温度发生变化时,它可以通知其他对象执行相应的操作。

using System;
// 定义一个委托,用于处理温度变化事件
delegate void TemperatureChangeHandler(double temperature);
// 温度监控类
class TemperatureMonitor
{
    // 定义事件,将委托作为事件处理程序
    public event TemperatureChangeHandler TemperatureChanged;
    private double currentTemperature; // 当前温度
    // 属性,获取和设置当前温度,当温度发生变化时触发事件
    public double CurrentTemperature
    {
        get { return currentTemperature; }
        set
        {
            if (value != currentTemperature)
            {
                currentTemperature = value;
                OnTemperatureChanged(value); // 温度变化时调用事件
            }
        }
    }
    // 触发温度变化事件的方法
    protected virtual void OnTemperatureChanged(double temperature)
    {
        TemperatureChanged?.Invoke(temperature); // 调用事件处理程序
    }
}
class Program
{
    static void Main(string[] args)
    {
        TemperatureMonitor monitor = new TemperatureMonitor();
        // 订阅温度变化事件,将方法 OnTemperatureChanged 作为事件处理程序
        monitor.TemperatureChanged += OnTemperatureChanged;
        // 改变当前温度,触发事件
        monitor.CurrentTemperature = 25.5;
        Console.ReadKey();
    }
    // 温度变化事件处理程序
    static void OnTemperatureChanged(double temperature)
    {
        Console.WriteLine($"温度变化 {temperature}°C");
    }
}
//案例参考:C#委托事件-张子阳

效果如下:

以上代码示例使用了委托和事件,实现了观察者模式。观察者模式是一种行为设计模式,它定义了对象之间的一对多依赖关系,使得当一个对象的状态发生变化时,所有依赖于它的对象都会得到通知并自动更新。在这个示例中,TemperatureMonitor 类充当了被观察者(发布者),Program 类中的 OnTemperatureChanged 方法充当观察者(订阅者)

结语

委托和事件是C#中的重要概念,在C#中无论是实现回调机制、处理异步操作,还是实现事件驱动的架构,委托和事件都是不可缺的,每个.NET开发者都应该深入了解和熟练掌握。本文只列出了部分基础知识点,更多知识点大家可以到官网查询。

希望本文对你有所收获,对于C#委托和事件的知识点,你还知道哪些?欢迎留言讨论或者吐槽本文。

参考:

1、chatgpt

2、微软官方文档 :

委托:learn.microsoft.com/zh-cn/dotnet/csharp/programming-guide/delegates/

事件:learn.microsoft.com/zh-cn/dotnet/csharp/programming-guide/events/文章来源地址https://www.toymoban.com/news/detail-661750.html

来源公众号:DotNet开发跳槽

到了这里,关于每个.NET开发都应掌握的C#委托事件知识点的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 每个.NET开发都应掌握的C#异常处理知识点

    上篇文章讲述了C#集合知识点,本文将介绍C#异常处理知识点。异常处理是.NET开发中至关重要的一部分,它允许开发者在程序出现错误或不正常情况时采取适当的措施,从而提高应用程序的稳定性和可靠性。本文将介绍C#异常处理知识点,异常的基本概念略过,请查看官网。

    2024年02月08日
    浏览(55)
  • 每个.NET开发都应掌握的C#特性(Attribute)知识点

    上篇文章讲述了C#反射知识点,本文将介绍C#特性(Attribute)的知识点。C#特性(Attribute)是一种强大的元数据机制,用于为代码元素(如类、方法、属性等)添加信息,以影响它们的行为或提供额外的信息。本文将介绍C#特性每个.NET开发都应熟悉的知识点,希望对大家开发有

    2024年02月08日
    浏览(42)
  • 每个.NET开发都应掌握的C#处理文件系统I/O知识点

    上篇文章讲述了C#多线程知识点,本文将介绍C#处理文件的知识点。在.NET开发领域,文件系统I/O是一个至关重要的主题,尤其是在处理文件、目录和数据存储方面。C#作为.NET平台的主要编程语言,提供了丰富而强大的文件系统I/O功能,为开发人员提供了灵活的工具,使其能够

    2024年02月05日
    浏览(45)
  • 每个.NET开发都应掌握的linq知识点

    LINQ是C#3.0引入的特性,让处理对象就像执行SQL语句一样简单,对于提高C#开发效率有革命性的作用。 对于每个.NET开发者来说,掌握C#的LINQ知识点是非常重要的。LINQ是C#的一个强大的特性,它为数据查询和操作提供了简洁、统一的语法,使得数据处理变得更加直观和灵活。 以

    2024年02月14日
    浏览(51)
  • C#学习笔记--数据结构、泛型、委托事件等进阶知识点

    ArrayList 元素类型以Object类型存储,支持增删查改的数组容器。 因而存在装箱拆箱操作,谨慎使用。 ArrayList和数组区别? ArrayList使用不用说明固定长度,数组则需要 数组存储的是指定类型的,ArrayList是Object ArrayList存在装箱拆箱,数组不存在 ArrayList数组长度用Count获取 而数组

    2024年02月08日
    浏览(49)
  • 【C#学习笔记】委托与事件 (从观察者模式看C#的委托与事件)

    转载请注明出处:🔗https://blog.csdn.net/weixin_44013533/article/details/134655722 作者:CSDN@|Ringleader| 主要参考: 委托(C# 编程指南) 事件介绍 C# 中的委托和事件简介 Delegate 类 Exploring the Observer Design Pattern微软技术文章翻译 委托是一种 引用类型 ,表示对具有特定参数列表和返回类型

    2024年02月04日
    浏览(49)
  • c# 事件与委托

    //在C#中, 事件是一种特殊的委托 ,它允许对象通知其他对象发生了某个特定的事件。 //事件通常用于GUI应用程序中,例如当用户单击按钮时,按钮控件会引发Click事件, //然后其他对象可以订阅该事件并执行相应的操作。 //以下是一个简单的示例,演示如何在C#中使用事件和

    2024年02月06日
    浏览(41)
  • C#委托和事件简单复习

    太久没用了,简单的复习一下 快速过一遍语法使用 1.定义一个委托类型 只需要在声明的前面加上delegate,其他的就跟声明一个方法(函数)类似 2.使用刚刚声明的委托 需要定义一个返回值跟参数与我们刚刚定义的委托一致 3.然后声明一个SayHello类型(委托)的变量 把

    2024年02月14日
    浏览(45)
  • 委托与事件(一)——C#版本

      委托是对 函数的封装 ,可以当作给方法的特征指定一个名称。而事件则是 委托的一种特殊形式 ,当发生有意义的事情时,事件对象处理通知过程。   委托是一种引用方法的类型。一旦为委托分配了方法,委托将与该方法具有 完全相同的行为 。   用例子来说明为

    2023年04月09日
    浏览(45)
  • C#学习,委托,事件,泛型,匿名方法

    目录 委托 声明委托 实例化委托 委托的多播 委托的用途 事件 通过事件使用委托 声明事件 泛型 泛型的特性 泛型方法 泛型的委托 匿名方法 编写匿名方法的语法 类似于指针,委托是存有对某个方法的引用的一种引用类型变量,引用可以在运行时被改变。特别用于实现事件和

    2024年02月12日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包