当前位置: 首页 > news >正文

C#面试常考随笔7:什么是匿名⽅法?还有Lambda表达式?

匿名方法本质上是一种没有显式名称的方法,它可以作为参数传递给需要委托类型方法,常用于事件处理、回调函数等场景,能够让代码更加简洁和紧凑。

使用场景

  • 事件处理:在处理事件时,不需要为每个事件处理程序单独定义一个命名方法,可以直接使用匿名方法。
  • 回调函数:当某个方法需要一个委托作为参数,用于后续的回调操作时,可以使用匿名方法来提供具体的实现逻辑。

语法

匿名方法使用 delegate 关键字来定义,基本语法如下:

delegate (参数列表)
{方法体;
};

示例:

无参数的匿名方法
using System;class Program
{static void Main(){// 定义一个无参数的委托类型Action myAction = delegate (){Console.WriteLine("这是一个无参数的匿名方法");};// 调用委托myAction();}
}
带参数的匿名方法
using System;class Program
{static void Main(){// 定义一个带参数的委托类型Func<int, int, int> add = delegate (int a, int b){return a + b;};// 调用委托int result = add(3, 5);Console.WriteLine($"结果是: {result}");}
}
在事件处理中使用匿名方法
using System;
using System.Threading;class EventExample
{public event EventHandler MyEvent;public void TriggerEvent(){MyEvent?.Invoke(this, EventArgs.Empty);}
}class Program
{static void Main(){EventExample example = new EventExample();// 使用匿名方法处理事件example.MyEvent += delegate (object sender, EventArgs e){Console.WriteLine("事件被触发了");};// 触发事件example.TriggerEvent();}
}

优缺点

优点
  • 代码简洁:避免了为每个简单的委托实现单独定义一个命名方法,减少了代码量,使代码更加紧凑。
  • 内联定义:可以在需要委托的地方直接定义逻辑,提高了代码的可读性和可维护性。
缺点
  • 复用性差:由于匿名方法没有名称,不能在其他地方复用,只能在定义的地方使用。
  • 调试不便:在调试时,由于没有明确的方法名称,可能会增加调试的难度。

与 Lambda 表达式的关系

在 C# 3.0 及以后的版本中,引入了 Lambda 表达式,它是一种更简洁的创建委托实例的方式,通常可以替代匿名方法。例如,上面的 add 委托使用 Lambda 表达式可以写成:

Func<int, int, int> add = (a, b) => a + b;

Lambda 表达式在语法上更加简洁,因此在实际开发中使用更为广泛。

参数列表规则

  • 无参数:如果 Lambda 表达式不需要参数,可以使用空的参数列表,例如:() => Console.WriteLine("无参数的Lambda表达式");
  • 单个参数:当只有一个参数时,可以省略参数列表的括号,例如:num => num * 2;
  • 多个参数:多个参数需要用逗号分隔,并放在括号内,例如:(a, b) => a + b;
http://www.lryc.cn/news/529574.html

相关文章:

  • Elasticsearch:如何搜索含有复合词的语言
  • 【Numpy核心编程攻略:Python数据处理、分析详解与科学计算】1.25 视觉风暴:NumPy驱动数据可视化
  • idea maven本地有jar包,但还要从远程下载
  • C++编程语言:抽象机制:模板(Bjarne Stroustrup)
  • 深入解析 Linux 内核中的页面错误处理机制
  • 【AIGC专栏】AI在自然语言中的应用场景
  • Ubuntu 20.04安装Protocol Buffers 2.5.0
  • 解锁豆瓣高清海报(一) 深度爬虫与requests进阶之路
  • 计算机组成原理——数据运算与运算器(二)
  • SpringBoot+Vue的理解(含axios/ajax)-前后端交互前端篇
  • 【AI】DeepSeek 概念/影响/使用/部署
  • javascript-es6 (二)
  • 供应链系统设计-供应链中台系统设计(十四)- 清结算中心设计篇(三)
  • 【自学笔记】MySQL的重点知识点-持续更新
  • X86路由搭配rtl8367s交换机
  • Linux环境基础开发工具的使用(apt, vim, gcc, g++, gbd, make/Makefile)
  • 多模态论文笔记——ViViT
  • 搜索与图论复习1
  • 【数据结构】初识链表
  • 第11章:根据 ShuffleNet V2 迁移学习医学图像分类任务:甲状腺结节检测
  • deepseek+vscode自动化测试脚本生成
  • 深入理解Flexbox:弹性盒子布局详解
  • android Camera 的进化
  • 仿真设计|基于51单片机的氨气及温湿度检测报警
  • 关于EDGE IMPULSE的使用与适配,包含如何学习部署在对应的板子
  • 【Python蓝桥杯备赛宝典】
  • 数据结构 前缀中缀后缀
  • 【cocos官方案例改】跳跃牢猫
  • 基于Python的药物相互作用预测模型AI构建与优化(上.文字部分)
  • Day51:type()函数