学懂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表达式的结合使用详解
在C#中,委托与Lambda表达式的结合使用是现代编程实践中的一个重要且强大的特性,它极大地提高了代码的简洁性和可读性。下面将详细讲解这两个概念如何协同工作,以及如何在实际编程中有效利用它们。 委托基础 委托是C#中的一种引用类型&#x…...

05-java基础——循环习题
循环的选择:知道循环的次数或者知道循环的范围就使用for循环,其次再使用while循环 猜数字 程序自动生成一个1-100之间的随机数,在代码中使用键盘录入去猜出这个数字是多少? 要求:使用循环猜,一直猜中为止…...

网络安全等级保护测评
网络安全等级保护 《GB17859 计算机信息系统安全保护等级划分准则》 规定计算机信息系统安全保护等级共分五级 《中华人民共和国网络安全法》 “国家实行网络安全等级保护制度。 等级测评 测评机构依据国家网络安全等级保护制度规定,按照有关 管理规范和…...

真有被这套零售数据分析方案惊艳到
在数字化时代,零售行业的竞争愈发激烈,如何精准把握市场动态、优化业务流程、提升市场竞争力成为了每一家零售企业都面临的挑战。奥威BI零售数据分析方案,一款具备全面、高效、智能的数据分析能力的BI方案出现地恰到好处。 奥威BI零售数据分…...

亚马逊卖家为何需要自养账号?揭秘背后的原因
亚马逊是一家极为重视用户体验的国际电商平台,因此用户的评论和星级评价对店铺排名影响深远。平台审核评论非常严格,这些评价直接影响商品在平台上的生存和发展。 在亚马逊上,用户的评分和评论对商品的成功至关重要。好评多的商品通常被认为优…...

牛了,LSTM+Transformer王炸结合创新,荣登Nature,精度高达95.65%
【LSTM结合Transformer】的研究方向探索了如何利用Transformer模型处理序列数据的能力以及LSTM在捕捉时间序列依赖性方面的优势。这一方向的意义在于通过融合两种模型的特点,提高了对复杂时空数据的预测准确性,尤其是在智能电网攻击检测、多变量时间序列…...

Java面试题:通过实例说明工厂模式和抽象工厂模式的用法,以及它们在解耦中的作用
工厂模式和抽象工厂模式是创建型设计模式中的两种,主要用于对象的创建,并且通过将对象的创建过程封装起来,来实现代码的解耦和灵活性。下面通过具体实例来说明这两种模式的用法及其在解耦中的作用。 工厂模式(Factory Method Pat…...

成都欣丰洪泰文化传媒有限公司电商服务的创新者
在数字化浪潮席卷全球的今天,电商行业正以前所未有的速度蓬勃发展。作为这一领域的佼佼者,成都欣丰洪泰文化传媒有限公司凭借其对电商服务的深度理解和精准把握,成功在竞争激烈的市场中脱颖而出,成为行业内的佼佼者。 一、公司简…...

学习笔记——动态路由——RIP(距离矢量协议)
一、距离矢量协议 1、距离矢量协议 矢量行为:协议收到一个路由之后,查看是否可以加入到本地的路由表中,如果可以加入,则可以传递,如果不可以加入,则无法传递。 距离矢量路由协议 RIP基于距离矢量算法(又…...

【python】OpenCV—Segmentation
文章目录 cv2.kmeans牛刀小试 cv2.kmeans cv2.kmeans 是 OpenCV 库中用于执行 K-Means 聚类算法的函数。以下是根据参考文章整理的 cv2.kmeans 函数的中文文档: 一、函数功能 cv2.kmeans 用于执行 K-Means 聚类算法,将一组数据点划分到 K 个簇中&…...

python-题库篇-Python语言特性
文章目录 Python语言特性1 Python的函数参数传递2 Python中的元类(metaclass)3 staticmethod和classmethod4 类变量和实例变量5 Python自省6 字典推导式7 Python中单下划线和双下划线8 字符串格式化:%和.format9 迭代器和生成器10 *args and **kwargs11 面向切面编程AOP和装饰器…...

WEB界面上使用ChatGPT
(作者:陈玓玏) 开源项目,欢迎star哦,https://github.com/tencentmusic/cube-studio 随着大模型不断发展,现在无论写代码,做设计,甚至老师备课、评卷都可以通过AI大模型来实现了&…...

【Matlab】CNN-LSTM分类 卷积神经网络-长短期记忆神经网络组合模型(附代码)
资源下载: https://download.csdn.net/download/vvoennvv/89466499 分类算法资源合集:https://download.csdn.net/download/vvoennvv/89466519 目录 Matlab SVM支持向量机分类算法 Matlab RF随机森林分类算法 Matlab RBF径向基神经网络分类算法 Ma…...

性能工具之 MySQL OLTP Sysbench BenchMark 测试示例
文章目录 一、前言二、测试环境1、服务器配置2、测试拓扑 三、测试工具安装四、测试步骤1、导入数据2、压测数据3、清理数据 五、结果解析六、最后 一、前言 做为一名性能工程师掌握对 MySQL 的性能测试是非常必要的,本文基于 Sysbench 对MySQL OLTP(联…...

【QT】QCustomPlot库中iSelectPlottables的使用
QCP::iSelectPlottables 是 QCustomPlot 库中的一个枚举值,用于控制选择交互。QCustomPlot 是一个用于创建绘图和数据可视化的Qt库。 QCP::iSelectPlottables 允许用户选择图表中的绘图对象(如图形、曲线、柱状图等)。 应用场景 QCP::iSele…...

字节跳动联手博通:5nm AI芯片诞生了?
字节跳动联手博通:5nm AI芯片诞生了? 前言 就在6月24日,字节跳动正在与美国博通合作开发一款5纳米工艺的专用集成电路(ASIC) AI处理器。这款芯片旨在降低采购成本并确保高端AI芯片的稳定供应。 根据报道,尽管芯片设计工作进展顺利…...

【数据结构与算法】动态查找表(二叉排序树,二叉平衡树)详解
二叉排序树的数据结构。 struct TreeNode {ElemType data;TreeNode *left, *right; }; using BiTree TreeNode *;结构体包含三个成员: data 是一个 ElemType 类型的变量,用于存储二叉搜索树节点的数据。left 是一个指向 TreeNode 类型的指针ÿ…...

PyTorch中“No module named ‘torch._six‘“的报错场景及处理方法
🎬 鸽芷咕:个人主页 🔥 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! 引入 在使用PyTorch时,您可能会遇到"No module named ‘torch._six’"的错误。这通常是因为PyTorch的某些…...

Spring Boot 集成 MinIO 实现文件上传
Spring Boot 集成 MinIO 实现文件上传 一、 Minio 服务准备 MinIO的搭建过程参考 Docker 搭建 MinIO 对象存储。 登录MinIO控制台,新建一个 Bucket,修改 Bucket 权限为公开。 二、MinIO 集成 添加 MinIO 依赖 <!-- https://mvnrepository.com/ar…...

目标跟踪——KCF源码用python实现
from numpy.fft import fft2, ifft2, fftshift import cv2 import numpy as npclass HOG:def __init__(self, winSize):""":param winSize: 检测窗口的大小"""self.winSize winSizeself.blockSize (8, 8)self.blockStride (4, 4)self.cellSiz…...

前端 转换笔记
<!DOCTYPE html> <html> <head> <meta charset"utf-8" /> <title>转换</title> <style> .box{ /* 盒子摆在body的正中间 */ position: absolut…...

个人开发笔记
开发笔记 开发常见问题Vue开发中页面flex滚动布局,内容置顶问题功能快捷键 开发常见问题 Vue开发中页面flex滚动布局,内容置顶问题 直接操作路由: const router createRouter({routes: routes,history: createWebHashHistory(),scrollBeha…...

pdf压缩,pdf压缩在线,pdf文件太大怎么变小
在数字化时代,PDF文档因其跨平台、保持原样、易于阅读和打印等特点,成为了我们日常工作和生活中不可或缺的一部分。然而,随着PDF文件的不断累积,存储空间逐渐变得紧张,特别是在处理大量大型PDF文件时,如何有…...

Go 如何使用指针灵活操作内存
💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…...

【面试干货】Java中的++操作符与线程安全性
【面试干货】Java中的操作符与线程安全性 1、什么是线程安全性?2、 操作符的工作原理3、 操作符与线程安全性4、如何确保线程安全?5、 结论 💖The Begin💖点点关注,收藏不迷路💖 在Java编程中,操…...

NLP学习与踩坑记录(持续更新版)
NLP学习与踩坑记录(持续更新版) OSError: Cant load tokenizer for bert-base-uncased.google.protobuf.message.DecodeError: Error parsing messageDeepspeed 本博客记录了博主在学习NLP时遇到了各种各样的问题与解决方法,供大家参考&#…...

Java也能做OCR!SpringBoot 整合 Tess4J 实现图片文字识别
文章目录 1. 环境准备1.1 安装 Tesseract OCR 引擎1.2 引入 Tess4J 依赖 2. 创建 Spring Boot 项目2.1 初始化项目2.2 目录结构 3. 编写 OCR 功能代码3.1 创建服务层3.2 创建控制器层 4. 配置 Tesseract 语言包5. 运行和测试5.1 启动 Spring Boot 应用5.2 使用 Postman 或 cURL…...

微信小程序常用标签及其用法
大家好,我是linzi,今天我来给大家分享一下微信小程序一些个常用的标签及其用法 1. <view> 标签 <view> 标签是小程序中最常用的标签之一,用于组织和布局页面上的内容,类似于HTML中的 <div> 标签。 <view …...

开发查询订单信息fastGPT智能体工作流 将工作流接入到人工客服系统
我在抖音上发布了视频 https://www.douyin.com/video/7382446337482099977 下面是主要内容介绍 【视频标题:】开发查询订单信息fastGPT智能体工作流 将工作流接入到人工客服系统 #智能体 #FastGPT #客服系统-----------【视频行业分类:】<3C数码>-…...

Flink集群运行模式
我们了解了flink的一个集群的一个基础架构,包括里面核心的一些组件,比如说job manager,task manager等一些组件的一些主要的一些组成。本节课程开始我们学习flink的一个集群部署模式。首先我们来看一下flink集群部署模式究竟应该有哪一些种类…...