百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程网 > 正文

C# 开发者必看:从委托到事件,再到 Lambda 表达式的实际应用

yuyutoo 2025-03-30 22:52 2 浏览 0 评论

在 C# 中,委托、事件和 Lambda 表达式是三个重要的概念,它们不仅是语言的基础特性,也是开发者高效编程的关键工具。理解并熟练掌握这三个概念,可以让你在构建灵活、可扩展和高效的应用时如鱼得水。本文将通过实际应用示例,带你深入探索它们在 C# 开发中的强大功能。


1.委托的实际应用

1.1回调机制(Callback Mechanism)

委托作为 C# 中的“函数指针”,使得方法调用更加灵活。回调机制是委托最常见的应用之一,广泛用于异步操作或事件驱动编程中。

示例:回调函数

假设我们需要模拟一个文件读取操作,读取完成后调用一个回调方法来处理文件内容。

using System;
using System.IO;

public delegate void FileReadCompleted(string content);

public class FileReader
{
    public void ReadFileAsync(string filePath, FileReadCompleted callback)
    {
        // 模拟异步读取文件
        System.Threading.Tasks.Task.Run(() =>
        {
            System.Threading.Thread.Sleep(2000); // 模拟延迟
            string content = File.ReadAllText(filePath);
            callback(content); // 文件读取完成后调用回调
        });
    }
}

public class Program
{
    public static void Main()
    {
        FileReader reader = new FileReader();
        reader.ReadFileAsync("example.txt", (content) =>
        {
            Console.WriteLine("File content received:");
            Console.WriteLine(content);
        });

        Console.WriteLine("File is being read...");
        Console.ReadLine(); // 等待异步操作完成
    }
}

解释:

  • FileReadCompleted 委托定义了一个接受文件内容的回调函数。
  • ReadFileAsync 方法模拟异步读取文件,读取完成后调用回调函数来处理文件内容。

1.2多播委托(Multicast Delegates)

委托不仅可以指向一个方法,还可以指向多个方法。当一个委托被触发时,所有指向的方法都会依次执行,这就是多播委托。

示例:多播委托

using System;

public delegate void ProcessCompleted();

public class Processor
{
    public event ProcessCompleted OnProcessCompleted;

    public void StartProcess()
    {
        Console.WriteLine("Processing started...");
        OnProcessCompleted?.Invoke();  // 触发事件
    }
}

public class Program
{
    public static void Main()
    {
        Processor processor = new Processor();
        
        // 订阅多个事件处理程序
        processor.OnProcessCompleted += () => Console.WriteLine("Process Completed - Handler 1");
        processor.OnProcessCompleted += () => Console.WriteLine("Process Completed - Handler 2");
        
        processor.StartProcess(); // 触发所有事件处理程序
    }
}

输出:

Processing started...
Process Completed - Handler 1
Process Completed - Handler 2

解释:

  • 通过 += 操作符,多个处理方法被绑定到 OnProcessCompleted 事件。
  • 事件触发时,所有绑定的方法都会被依次调用。

2.事件的实际应用

2.1事件驱动编程

事件驱动编程是一种常见的编程模式,尤其在 GUI 应用程序(如 Windows Forms 或 WPF)中非常常见。事件通常用来响应用户交互,例如按钮点击、窗口关闭等。

示例:GUI 中的按钮点击事件

using System;
using System.Windows.Forms;

public class MyForm : Form
{
    private Button btnClickMe;

    public MyForm()
    {
        btnClickMe = new Button();
        btnClickMe.Text = "Click Me!";
        btnClickMe.Click += BtnClickMe_Click; // 订阅按钮点击事件
        Controls.Add(btnClickMe);
    }

    private void BtnClickMe_Click(object sender, EventArgs e)
    {
        MessageBox.Show("Button clicked!");
    }

    [STAThread]
    static void Main()
    {
        Application.Run(new MyForm());
    }
}

解释:

  • btnClickMe.Click 是一个事件,表示按钮点击时触发。
  • 当用户点击按钮时,事件处理程序 BtnClickMe_Click 被调用,弹出消息框。

2.2自定义事件

在应用程序中,事件也可以用于通知系统的某些状态或操作完成。通过事件,可以实现发布/订阅模式(Observer Pattern),解耦不同组件之间的关系。

示例:进度更新事件

using System;

public delegate void ProgressChangedEventHandler(object sender, int progress);

public class Downloader
{
    public event ProgressChangedEventHandler ProgressChanged;

    public void DownloadFile()
    {
        for (int i = 1; i <= 100 i system.threading.thread.sleep50 protected virtual void progress progresschanged.invokethis progress public class program public static void main downloader downloader='new' downloader downloader.progresschanged>
        {
            Console.WriteLine($"Download Progress: {progress}%");
        };
        
        downloader.DownloadFile(); // 启动下载
    }
}

输出:

Download Progress: 1%
Download Progress: 2%
...
Download Progress: 100%

解释:

  • ProgressChanged 事件用于报告下载进度。
  • 每次进度变化时,都会触发事件,通知订阅者更新界面或执行其他操作。

3.Lambda 表达式的实际应用

3.1LINQ 查询

Lambda 表达式在 LINQ 查询中广泛使用,它简化了数据筛选、排序、分组等操作。通过 Lambda 表达式,你可以非常简洁地编写复杂的数据处理逻辑。

示例:使用 Lambda 过滤和转换数据

using System;
using System.Collections.Generic;
using System.Linq;

public class Program
{
    public static void Main()
    {
        List numbers = new List { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
        
        // 使用 Lambda 表达式过滤和转换数据
        var evenNumbers = numbers.Where(n => n % 2 == 0).Select(n => n * 2).ToList();
        
        Console.WriteLine("Even numbers doubled:");
        foreach (var number in evenNumbers)
        {
            Console.WriteLine(number); // 输出 4, 8, 12, 16, 20
        }
    }
}

输出:

Even numbers doubled:
4
8
12
16
20

解释:

  • Where(n => n % 2 == 0):Lambda 表达式用于筛选出偶数。
  • Select(n => n * 2):Lambda 表达式用于将筛选出的偶数值翻倍。

3.2事件处理中的 Lambda 表达式

Lambda 表达式也非常适合用于事件处理,尤其是在需要简洁、一次性的事件处理程序时,Lambda 表达式可以使代码更加紧凑。

示例:按钮点击事件中的 Lambda 表达式

using System;
using System.Windows.Forms;

public class MyForm : Form
{
    private Button btnClickMe;

    public MyForm()
    {
        btnClickMe = new Button();
        btnClickMe.Text = "Click Me!";
        btnClickMe.Click += (sender, e) => MessageBox.Show("Button clicked via Lambda!");
        Controls.Add(btnClickMe);
    }

    [STAThread]
    static void Main()
    {
        Application.Run(new MyForm());
    }
}

解释:

  • 使用 Lambda 表达式直接在事件订阅时定义事件处理程序,而不需要额外的命名方法。简化了代码并提高了可读性。

总结:委托、事件与 Lambda 表达式的强大结合

  • 委托 提供了灵活的回调机制和多播功能,使得方法调用更加动态和松耦合。
  • 事件 通过委托实现了发布/订阅模式,使得应用程序可以在发生特定操作时通知其他组件,尤其适用于异步编程和 GUI 编程。
  • Lambda 表达式 让 C# 更加简洁,特别是在 LINQ 查询和事件处理等场景中,它能够提升代码的可读性和表达能力。

掌握这些技术,不仅能够帮助你编写高效、简洁的代码,还能帮助你更好地构建灵活、可维护的 C# 应用程序。这些工具的结合,特别是在事件驱动和异步编程

相关推荐

YAML配置文件简介及使用(yaml 配置)

简介YAML是"YAMLAin'taMarkupLanguage"(YAML不是一种标记语言)的缩写。相比JSON格式的方便。...

教你如何解决最常见的58种网络故障排除方法

1.故障现象:网络适配器(网卡)设置与计算机资源有冲突。分析、排除:通过调整网卡资源中的IRQ和I/O值来避开与计算机其它资源的冲突。有些情况还需要通过设置主板的跳线来调整与其它资源的冲突。2.故障现...

一分钟带你了解服务器网卡(服务器网卡怎么用)

今天小编和大家聊一下服务器的网卡。什么是网卡?简单说网卡就是计算机与局域网互连的设备。计算机主要通过网卡接入网络。网卡又称为网络适配器或网络接口卡NIC(NetworkinterfaceCard)...

linux文件之ssh配置文件的含义与作用

ssh远程登录命令是操作系统(包括linux和window系统)下常用的操作命令,可以帮助用户,远程登录服务器系统,查看,操作系统相关信息。linux系统对于ssh命令有专门保存其相关配置的目录和文件...

Cilium 官方文档翻译 - IPAM(二)Kubernetes Host模式

KubernetesHostScopeciliumIPAM的kuberneteshost-scope模式通过选项ipam:kubernetes开启,将集群IP地址分配委托给每个独立的节点,并...

域名劫持跳转,域名劫持跳转的解决办法只需5步

简单来说,域名劫持就是把原本准备访问某网站的用户,在不知不觉中,劫持到仿冒的网站上,例如用户准备访问某家知名品牌的网上商店,黑客就可以通过域名劫持的手段,把其带到假的网上商店,同时收集用户的ID信息和...

Linux基本命令(linux基本命令总结)

...

Linux 磁盘和文件系统管理(linux磁盘管理fdisk)

1检测并确认新硬盘...

windows host文件怎么恢复?局域网访问全靠这些!

windowshost文件怎么恢复?windowshost文件是常用网址域名及其相应IP地址建立一个关联文件,通过这个host文件配置域名和IP的映射关系,以提高域名解析的速度,方便局域网用户使用...

Nginx配置文件详解与优化建议(nginx 配置详解)

1、概述今天来详解一下Nginx的配置文件,以及给出一些配置建议,希望能对大家有所帮助。...

Mac电脑hosts文件锁定,如何修改hosts文件权限

有时候我们需要修改hosts文件,但是网上很多教程都行不通,使用sudo命令也不行。其实有一个很简单的方法。打开终端命令行,使用如下命令即可:sudochflags-hvnoschg/etc/...

windows电脑如何修改hosts文件?(windows 修改hosts文件)

先来简单说下电脑host的作用hosts文件的作用:hosts文件是一个用于储存计算机网络中各节点信息的计算机文件;作用是将一些常用的网址域名与其对应的IP地址建立一个关联“数据库”,当用户在浏览器中...

Vigilante恶意软件行为怪异:修改Hosts文件以阻止受害者访问盗版网站

Sophos刚刚报道了一款名叫Vigilante的恶意软件,但其行为却让许多受害者感到不解。与其它专注于偷密码、搞破坏、或勒索赎金的恶意软件不同,Vigilante会通过修改Hosts文件...

hosts文件无法修改几种现象和解决方法

第一种、hosts文件修改完不是直接保存而是弹出另存为窗口解决:1、右击hosts文件——属性——把“只读”前面勾去掉。第二种、打开hosts文件时提示“你没有权限打开该文件,请向文件的所有者或管理员...

hosts文件位置在哪里,教你hosts文件位置在哪里

Hosts是一个没有扩展名的系统文件,其基本作用就是将一些常用的网址域名与其对应的IP地址建立一个关联"数据库",当用户在浏览器中输入一个需要登录的网址时,系统会首先自动从Hosts文件中寻找对应的I...

取消回复欢迎 发表评论: