学懂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…...
uniapp 对接腾讯云IM群组成员管理(增删改查)
UniApp 实战:腾讯云IM群组成员管理(增删改查) 一、前言 在社交类App开发中,群组成员管理是核心功能之一。本文将基于UniApp框架,结合腾讯云IM SDK,详细讲解如何实现群组成员的增删改查全流程。 权限校验…...
突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合
强化学习(Reinforcement Learning, RL)是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程,然后使用强化学习的Actor-Critic机制(中文译作“知行互动”机制),逐步迭代求解…...
Python爬虫实战:研究feedparser库相关技术
1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...
数据链路层的主要功能是什么
数据链路层(OSI模型第2层)的核心功能是在相邻网络节点(如交换机、主机)间提供可靠的数据帧传输服务,主要职责包括: 🔑 核心功能详解: 帧封装与解封装 封装: 将网络层下发…...
Rapidio门铃消息FIFO溢出机制
关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系,以下是深入解析: 门铃FIFO溢出的本质 在RapidIO系统中,门铃消息FIFO是硬件控制器内部的缓冲区,用于临时存储接收到的门铃消息(Doorbell Message)。…...
DingDing机器人群消息推送
文章目录 1 新建机器人2 API文档说明3 代码编写 1 新建机器人 点击群设置 下滑到群管理的机器人,点击进入 添加机器人 选择自定义Webhook服务 点击添加 设置安全设置,详见说明文档 成功后,记录Webhook 2 API文档说明 点击设置说明 查看自…...
水泥厂自动化升级利器:Devicenet转Modbus rtu协议转换网关
在水泥厂的生产流程中,工业自动化网关起着至关重要的作用,尤其是JH-DVN-RTU疆鸿智能Devicenet转Modbus rtu协议转换网关,为水泥厂实现高效生产与精准控制提供了有力支持。 水泥厂设备众多,其中不少设备采用Devicenet协议。Devicen…...
rknn toolkit2搭建和推理
安装Miniconda Miniconda - Anaconda Miniconda 选择一个 新的 版本 ,不用和RKNN的python版本保持一致 使用 ./xxx.sh进行安装 下面配置一下载源 # 清华大学源(最常用) conda config --add channels https://mirrors.tuna.tsinghua.edu.cn…...
算法打卡第18天
从中序与后序遍历序列构造二叉树 (力扣106题) 给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗 二叉树 。 示例 1: 输入:inorder [9,3,15,20,7…...
多元隐函数 偏导公式
我们来推导隐函数 z z ( x , y ) z z(x, y) zz(x,y) 的偏导公式,给定一个隐函数关系: F ( x , y , z ( x , y ) ) 0 F(x, y, z(x, y)) 0 F(x,y,z(x,y))0 🧠 目标: 求 ∂ z ∂ x \frac{\partial z}{\partial x} ∂x∂z、 …...
