学懂C#编程:常用高级技术——委托(Delegate)应用场景——委托与Lambda表达式的结合使用详解

本文主要是介绍学懂C#编程:常用高级技术——委托(Delegate)应用场景——委托与Lambda表达式的结合使用详解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

        在C#中,委托与Lambda表达式的结合使用是现代编程实践中的一个重要且强大的特性,它极大地提高了代码的简洁性和可读性。下面将详细讲解这两个概念如何协同工作,以及如何在实际编程中有效利用它们。

委托基础

        委托是C#中的一种引用类型,它允许封装一个方法的引用。你可以把它想象成一个可以存储和调用方法的变量。委托定义了方法的签名,包括返回类型、参数数量、参数类型等。

Lambda表达式基础

        Lambda表达式是一种编写内联匿名函数的方法,它提供了一种简洁的语法来定义方法。Lambda表达式由输入参数列表、箭头符号=>函数体组成。它在功能上等同于匿名方法,但语法更加紧凑和直观。

 

委托与Lambda结合使用

委托和Lambda表达式结合使用,可以简化代码,特别是在处理事件、LINQ查询、异步操作回调等场景中。

1. 直接赋值给委托变量
public delegate void MyDelegate(int x);class Program
{static void Main(string[] args){MyDelegate myDel = x => Console.WriteLine(x * x);myDel(5); // 输出25}
}

        在这个例子中,我们定义了一个委托类型MyDelegate,然后直接用一个Lambda表达式创建并赋值给myDel变量。Lambda表达式(x => Console.WriteLine(x * x))接受一个整数参数x,并打印其平方。

2. 作为方法参数
public static void ProcessNumbers(int[] numbers, Func<int, int> operation)
{foreach (var num in numbers){Console.WriteLine(operation(num));}
}class Program
{static void Main(string[] args){int[] nums = { 1, 2, 3, 4, 5 };ProcessNumbers(nums, x => x * 2); // 将每个数字乘以2并打印}
}

        这里,ProcessNumbers方法接受一个整数数组和一个Func<int, int>委托(这是C#内置的泛型委托,表示接受一个int参数并返回int值的方法)。我们传入一个Lambda表达式作为第二个参数,实现对数组中每个元素的乘2操作。

3. 在LINQ查询中

        Lambda表达式也是LINQ(Language Integrated Query)查询的核心,它们用于指定查询的筛选、排序等逻辑。

List<int> numbers = new List<int> { 5, 2, 8, 1, 9 };
var evenNumbers = numbers.Where(n => n % 2 == 0); // 使用Lambda表达式筛选偶数
foreach (var num in evenNumbers)
{Console.WriteLine(num);
}

在这个LINQ示例中,Where方法接受一个Lambda表达式(n => n % 2 == 0)来筛选出所有偶数。

4. 事件处理中的应用

事件通常与委托结合使用,Lambda表达式可以让事件处理器的注册更加简洁。

using System;public class Button
{public delegate void ClickHandler();public event ClickHandler Clicked;public void SimulateClick(){Clicked?.Invoke();}
}class Program
{static void Main(string[] args){Button button = new Button();button.Clicked += () => Console.WriteLine("Button clicked!");button.SimulateClick(); // 输出 "Button clicked!"}
}

 在这个例子中,Button类有一个事件Clicked,通过Lambda表达式注册了一个事件处理器,当按钮点击事件触发时,会打印出消息。

5. 异步操作的回调

Lambda表达式同样适用于异步编程中的回调处理,使代码更易于理解和维护。

using System;
using System.Threading.Tasks;class Program
{static async Task Main(string[] args){await Task.Run(() =>{// 模拟长时间运行的任务Task.Delay(2000).Wait();}).ContinueWith(task =>{Console.WriteLine("Task completed!");});Console.ReadLine();}
}

        这段代码主要展示了如何使用async/await关键字和Task类进行异步编程,目的是让程序在执行耗时操作时不会阻塞主线程,保持界面或控制台的响应性。

  • Task.Run方法在这里启动了一个新任务,它将在后台线程上执行传递给它的代码块。

    • 代码块内的Task.Delay(2000).Wait();模拟了一个长时间运行的操作,实际上只是让当前任务等待2秒。Task.Delay不会占用CPU资源,它只是简单地等待指定的时间间隔。
  • await关键字在此处告诉编译器,主线程应该等待这个任务完成,但在等待期间,主线程不会被阻塞,可以继续执行其他操作(如果有的话)。

  • ContinueWith方法用于在前一个任务(即Task.Run所启动的任务)完成后执行指定的操作。这里的操作是一个Lambda表达式,打印出"Task completed!"。

尽管这个例子使用了ContinueWith方法,现代C#更推荐使用async/await搭配Lambda表达式直接在异步方法内部处理逻辑,但这里展示了Lambda在异步回调中的基本用法。

优势

  • 简洁性:Lambda表达式使得代码更加简洁,减少了代码量,提高了可读性。
  • 即时性:可以在定义委托的同时直接定义其执行逻辑,无需单独定义方法。
  • 功能性:在函数式编程风格中,Lambda表达式配合委托能够轻松实现各种高阶函数操作。

总之,委托与Lambda表达式的结合使用,为C#编程提供了强大的工具,简化了代码结构,提高了开发效率,并使得代码更加现代化和易于维护。

这篇关于学懂C#编程:常用高级技术——委托(Delegate)应用场景——委托与Lambda表达式的结合使用详解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1084348

相关文章

Java中流式并行操作parallelStream的原理和使用方法

《Java中流式并行操作parallelStream的原理和使用方法》本文详细介绍了Java中的并行流(parallelStream)的原理、正确使用方法以及在实际业务中的应用案例,并指出在使用并行流... 目录Java中流式并行操作parallelStream0. 问题的产生1. 什么是parallelS

MySQL数据库双机热备的配置方法详解

《MySQL数据库双机热备的配置方法详解》在企业级应用中,数据库的高可用性和数据的安全性是至关重要的,MySQL作为最流行的开源关系型数据库管理系统之一,提供了多种方式来实现高可用性,其中双机热备(M... 目录1. 环境准备1.1 安装mysql1.2 配置MySQL1.2.1 主服务器配置1.2.2 从

Linux join命令的使用及说明

《Linuxjoin命令的使用及说明》`join`命令用于在Linux中按字段将两个文件进行连接,类似于SQL的JOIN,它需要两个文件按用于匹配的字段排序,并且第一个文件的换行符必须是LF,`jo... 目录一. 基本语法二. 数据准备三. 指定文件的连接key四.-a输出指定文件的所有行五.-o指定输出

Linux jq命令的使用解读

《Linuxjq命令的使用解读》jq是一个强大的命令行工具,用于处理JSON数据,它可以用来查看、过滤、修改、格式化JSON数据,通过使用各种选项和过滤器,可以实现复杂的JSON处理任务... 目录一. 简介二. 选项2.1.2.2-c2.3-r2.4-R三. 字段提取3.1 普通字段3.2 数组字段四.

Linux kill正在执行的后台任务 kill进程组使用详解

《Linuxkill正在执行的后台任务kill进程组使用详解》文章介绍了两个脚本的功能和区别,以及执行这些脚本时遇到的进程管理问题,通过查看进程树、使用`kill`命令和`lsof`命令,分析了子... 目录零. 用到的命令一. 待执行的脚本二. 执行含子进程的脚本,并kill2.1 进程查看2.2 遇到的

MyBatis常用XML语法详解

《MyBatis常用XML语法详解》文章介绍了MyBatis常用XML语法,包括结果映射、查询语句、插入语句、更新语句、删除语句、动态SQL标签以及ehcache.xml文件的使用,感兴趣的朋友跟随小... 目录1、定义结果映射2、查询语句3、插入语句4、更新语句5、删除语句6、动态 SQL 标签7、ehc

Java AOP面向切面编程的概念和实现方式

《JavaAOP面向切面编程的概念和实现方式》AOP是面向切面编程,通过动态代理将横切关注点(如日志、事务)与核心业务逻辑分离,提升代码复用性和可维护性,本文给大家介绍JavaAOP面向切面编程的概... 目录一、AOP 是什么?二、AOP 的核心概念与实现方式核心概念实现方式三、Spring AOP 的关

详解SpringBoot+Ehcache使用示例

《详解SpringBoot+Ehcache使用示例》本文介绍了SpringBoot中配置Ehcache、自定义get/set方式,并实际使用缓存的过程,文中通过示例代码介绍的非常详细,对大家的学习或者... 目录摘要概念内存与磁盘持久化存储:配置灵活性:编码示例引入依赖:配置ehcache.XML文件:配置

Java 虚拟线程的创建与使用深度解析

《Java虚拟线程的创建与使用深度解析》虚拟线程是Java19中以预览特性形式引入,Java21起正式发布的轻量级线程,本文给大家介绍Java虚拟线程的创建与使用,感兴趣的朋友一起看看吧... 目录一、虚拟线程简介1.1 什么是虚拟线程?1.2 为什么需要虚拟线程?二、虚拟线程与平台线程对比代码对比示例:三

从基础到高级详解Go语言中错误处理的实践指南

《从基础到高级详解Go语言中错误处理的实践指南》Go语言采用了一种独特而明确的错误处理哲学,与其他主流编程语言形成鲜明对比,本文将为大家详细介绍Go语言中错误处理详细方法,希望对大家有所帮助... 目录1 Go 错误处理哲学与核心机制1.1 错误接口设计1.2 错误与异常的区别2 错误创建与检查2.1 基础