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

C# 基础巩固 详解 匿名方法、lambda表达式和Action关键字

  • 匿名方法

    • C# 匿名方法定义

      C# 中的匿名方法是没有名称的方法,‌它在声明和初始化时就被使用。‌通常与委托(‌delegate)‌一起使用,‌以便将代码块作为参数传递给其他方法。‌匿名方法可以转换为System.Action 和 System.Func<TResult> 等类型,同时指定自定义的参数列表。匿名方法通常表现为使用delegate运算符Lambda表达式‌

    • 定义方式‌:‌

      • 使用 delegate 关键字声明委托类型。‌            
        • MyDelegate m = delegate(string x) { Console.WriteLine("匿名方法: {0}", x); }
      • 在需要委托实例的地方,‌直接定义匿名方法并赋值。
        • MyDelegate m = x => Console.WriteLine("匿名方法: {0}", x);
    • 使用场景
      • 临时需要小段逻辑,‌但不想单独定义一个完整的方法。‌
      • 作为事件处理器或回调方法。‌
      • 在需要委托类型但不想显式定义方法时。‌
    • 缺点

      • 可读性差‌:‌由于匿名方法没有具体的名称,‌当代码量较大时,‌可能会降低代码的可读性,‌使得其他开发者难以理解和维护。‌
      • 难以重用‌:‌匿名方法通常只在其定义的作用域内有效,‌无法在其他地方重用,‌这可能导致代码冗余,‌特别是在需要多次执行相同逻辑时。‌
      • 调试困难‌:‌在调试过程中,‌由于匿名方法没有名称,‌可能难以在调试器中直接定位到具体的匿名方法实现,‌增加了调试的难度。‌
      • 这些缺点使得匿名方法在某些情况下可能不是最佳选择,‌特别是在需要高可读性和可重用性的项目中。‌

    • 本质

      • C#匿名方法的本质是委托

  • lambda表达式

    • C# Lambda表达式定义

      Lambda 表达式的本质也是匿名方法。Lambda 表达式提供了一种简洁和富有表现力的方式来创建匿名函数,可以使用 => 运算符来构造 Lambda 表达式。

    • 定义方式

      • (input-parameters) => { <sequence-of-statements> }

        •  参数列表​​​​​​​(input-parameters) ‌:‌

          •    可包含零个或多个参数。‌
          • 参数类型可隐式或显式定义   
        • Lambda运算符‌:‌
          •  使用=>符号分隔参数列表和表达式/语句块。‌
        • 表达式/语句块‌:‌

          •  表达式:‌单个表达式,‌计算结果作为Lambda的返回值。‌
          •  语句块:‌包含在大括号{}中的一系列语句,‌可执行复杂逻辑,‌最后一个语句的结果作为返回值(‌若适用)。
    • 使用场景‌:‌

      •  常用于LINQ查询,‌提供简洁的数据查询和处理语法。‌
      •  用于事件处理,‌可以简化事件处理方法的编写。‌
      •  便于创建委托实例,‌特别是在需要传递简单函数作为参数时。‌
    •  C# Lambda样例
      •  基本Lambda表达式
        • ​​​​​​​ 无参数‌:‌() => Console.WriteLine("Hello, World!");
        • 单参数‌:‌ x => x * x
        • 多参数‌:‌(x, y) => x + y
        • 带语句块的Lambda     x => { int result = x * x; return result; }
      • Lambda表达式应用
        • ‌  LINQ查询‌:‌list.FindAll(x => x > 5);
        •  事件处理‌:‌button.Click += (s, e) => { /* 事件处理逻辑 */ };
  • Action

    •  Action的定义 

       ​​​​​​​ Action 是 C# 中的一个委托类型,‌表示没有返回值和参数的方法。‌它用于封装方法,‌以便可以将其作为参数传递、‌赋值给其他委托等。‌

       Action其实就是没有返回值的delegate

    • 创建方式 
      • ​​​​​​​直接实例化‌:‌
        •    通过指定方法来创建Action实例。‌
        • 示例:‌Action action = MyMethod;   
      • ​​​​​​​使用匿名方法‌:‌
        •    无需定义独立方法,‌直接在Action实例化时定义方法体。‌
        • 示例:‌Action action = () => { /* 方法体 */ };   
      • Lambda表达式‌:‌
        •    简洁方式,‌适用于简短逻辑或表达式。‌
        • 示例:‌Action action = () => Console.WriteLine("Hello, World!");   
      • 带参数的Action‌:‌
        •    创建带参数的Action,‌通过泛型指定参数类型。‌
        • 示例:‌Action<int> action = x => Console.WriteLine(x);  
    • 原理
      • ​​​​​​​委托揭秘 - Old - 博客园 (cnblogs.com)

         委托和匿名方法不能混淆。C#中的委托(Delegate)是一种引用类型,该引用类型与其他引用类型有所不同,在委托对象的引用中存放的不是对数据的引用,而是存放对方法的引用,即在委托的内部包含一个指向某个方法的指针。通过使用委托把方法的引用封装在委托对象中,然后将委托对象传递给调用引用方法的代码。

       委托是方法的类型安全的引用,之所以说委托是安全的,是因为委托和其他所有的C#成员一样,是一种数据类型,并且任何委托对象都是System.Delegate的某个派生类的一个对象。

 

      匿名方法是C#2.0引入的一个新特性,它允许开发者内联(inline)声明自己的函数代码而无须使用委托函数(delegate)。

      当我们需要一个函数,但又懒得去命名它的时候,就可以使用匿名方法。在 C# 中, 匿名方法通常表现为使用 delegate 运算符和 Lambda 表达式。   

              

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 如何在算家云搭建MindSearch(智能搜索)
  • 2024数学建模国赛B题代码
  • 探索非局部均值滤波在椒盐噪声去除中的应用
  • C# 删除Word文档中的段落
  • uniapp写的一个年月日时分秒时间选择功能
  • Linux-进程管理【重点】
  • elementUI之不会用
  • 《C Primer Plus》第 11 章复习题和编程练习
  • STM32 RTC实时时钟
  • 如何看待IBM中国研发部裁员!
  • 惩罚矩阵?动态规划是如何爱上矩阵的
  • rman 备份尽量使用 backup database plus archivelog
  • 数据库进阶:2.索引
  • 【 html+css 绚丽Loading 】 000045 太极旋流轮
  • 【SpringCloud】 实现负载均衡
  • 【附node操作实例】redis简明入门系列—字符串类型
  • Centos6.8 使用rpm安装mysql5.7
  • docker-consul
  • iOS筛选菜单、分段选择器、导航栏、悬浮窗、转场动画、启动视频等源码
  • leetcode378. Kth Smallest Element in a Sorted Matrix
  • Linux快速配置 VIM 实现语法高亮 补全 缩进等功能
  • node和express搭建代理服务器(源码)
  • react 代码优化(一) ——事件处理
  • Solarized Scheme
  • Spark RDD学习: aggregate函数
  • windows-nginx-https-本地配置
  • 从 Android Sample ApiDemos 中学习 android.animation API 的用法
  • 从重复到重用
  • 搭建gitbook 和 访问权限认证
  • 前端
  • 前端每日实战 2018 年 7 月份项目汇总(共 29 个项目)
  • 手机端车牌号码键盘的vue组件
  • 源码之下无秘密 ── 做最好的 Netty 源码分析教程
  • 好程序员大数据教程Hadoop全分布安装(非HA)
  • ​ubuntu下安装kvm虚拟机
  • # 数据结构
  • #我与Java虚拟机的故事#连载01:人在JVM,身不由己
  • (11)工业界推荐系统-小红书推荐场景及内部实践【粗排三塔模型】
  • (175)FPGA门控时钟技术
  • (2024,Vision-LSTM,ViL,xLSTM,ViT,ViM,双向扫描)xLSTM 作为通用视觉骨干
  • (6)添加vue-cookie
  • (7)摄像机和云台
  • (poj1.3.2)1791(构造法模拟)
  • (Redis使用系列) Springboot 使用redis的List数据结构实现简单的排队功能场景 九
  • (超详细)语音信号处理之特征提取
  • (二)十分简易快速 自己训练样本 opencv级联lbp分类器 车牌识别
  • (附源码)springboot优课在线教学系统 毕业设计 081251
  • (附源码)ssm高校升本考试管理系统 毕业设计 201631
  • (附源码)计算机毕业设计SSM疫情下的学生出入管理系统
  • (六)软件测试分工
  • (算法二)滑动窗口
  • (微服务实战)预付卡平台支付交易系统卡充值业务流程设计
  • (详细版)Vary: Scaling up the Vision Vocabulary for Large Vision-Language Models
  • (已解决)报错:Could not load the Qt platform plugin “xcb“
  • (转)【Hibernate总结系列】使用举例