CSharp的lambda表达式匿名类扩展方法

c#的lamba表达式

之前已经写过一些关于委托还有事件的文章,今天就来介绍一下lambda表达式。
首先定义需要的函数以及委托

{
public delegate void DoNothingDelegate();
public delegate void StudyDelegate(int id, string name);private void DoNothing()
{Console.WriteLine("DoNothing");
}private void Study(int id , string name)
{Console.WriteLine($"{id} {name} 学习 .Net高级班 " );
}
}

在.net farmwork 1.0,会这样写我们的匿名函数

public void Show(){{//.netframework 1.0的写法DoNothingDelegate doNothing = new DoNothingDelegate(DoNothing);StudyDelegate study = new StudyDelegate(Study);}}

在.netframework 2.0,会这样写匿名函数, 增加了一个delegate关键字

 {DoNothingDelegate doNothing = new DoNothingDelegate (delegate (){Console.WriteLine("DoNothing");});StudyDelegate study = new StudyDelegate( delegate (int id, string name){Console.WriteLine($"{id} {name} 学习 .Net高级班 ");});}

在.netframework3.0,去掉了delegate关键字了,在参数后增加了一个=> goes to

{DoNothingDelegate doNothing = new DoNothingDelegate(() =>{Console.WriteLine("DoNothing");});StudyDelegate study = new StudyDelegate((int id, string name) =>{Console.WriteLine($"{id} {name} 学习 .Net高级班 ");});
}

在.netframework3.0后期,我们可以省略参数的信息

 StudyDelegate study = new StudyDelegate((id, name) =>{Console.WriteLine($"{id} {name} 学习 .Net高级班 ");});

如果匿名方法体中只有一行代码,可以省略方法题的大括号

StudyDelegate study = new StudyDelegate((id, name) =>Console.WriteLine($"{id} {name} 学习 .Net高级班 "));

只有一个参数的时候,参数的小括号也可以省略掉。

public delegate void StudyNew(int id);
StudyNew study = id => Console.WriteLine($"{id} 学习 .Net高级班 ");

如果方法返回值?
如果lambda表达式中只有一行代码,且有返回值,可以省略return,

Func<int> retNum= () => 1;

lamba函数的本质是什么?

这里使用ilspy进行反编译来看一下匿名方法的实现是怎么样的

img

本质上来说,其实就是一个方法--匿名方法, 在类里面会生成和lambad 表达式参数和返回值完全匹配的方法.

匿名类

有时候,可以需要创建一个临时的类对象,保存数据,方便使用。
一个普通的类对象

public class Student{public int Id { get; set; }public int ClassId { get; set; }public string Name { get; set; }public int Age { get; set; }public string Description { get; set; }public void Study(){Console.WriteLine($"{this.Id} {this.Name} 跟着老师学习 .Net开发");}public void StudyQt(){Console.WriteLine($"{this.Id} {this.Name} 跟着老师学习C++ Qt");}}

当创建一个普通的类对象的时候,这样去创建一个类对象。

 Student student = new Student(){Id = 1,ClassId = 2,Name = "张三",Age = 20,Description = "这是一个学生"};

现在尝试最原始的方法去创建一个匿名类,

object model = new
{Id = 1,Name = "小楼一夜听春雨",Age = 14,Description = "魔刀丁鹏"
};

为什么可以定义一个匿名的对象?

因为C#中所有的对象都继承自Object对象.

当尝试使用.去访问其中的属性就会报错.

C#是强类型语言(编译时决定类型),object是在编译时确定类型,因为Object没有Id等属性,所以无法通过.去访问其中的变量.

因此可以使用下面的方法去访问我们的匿名对象中的属性.

 dynamic model1 = new{Id = 2,Name = "天下第一的剑客",Age = 18,Description = "神剑山庄谢晓峰"};Console.WriteLine(model1.Id);Console.WriteLine(model1.Age);Console.WriteLine(model1.Amy); //报错

这里使用了dynamic关键字去避开了编译器的检查,会在运行时检查,运行时决定类型.这个出现乱取的问题,导致程序崩溃.

有什么方法可以正确的取出想访问的属性,又可以避免访问不存在的属性那?
var关键字

  var model2 = new{Id = 3,Name = "天下第二的剑客",Age = 16,Description = "不会剑法的阿飞"};Console.WriteLine(model2.Id);Console.WriteLine(model2.Name);//Console.WriteLine(model2.Aniu); //报错!无法访问不存在的变量

var类型就是弱类型的变量.

使用的注意事项?

  1. 不能在匿名类里面声明方法,同时在声明匿名类的属性时候,就给定匿名类的属性初始值.
  2. 不能给属性重新赋值.
  3. var声明的变量必须初始化,必须能推算出类型,也不允许作为方法的参数类型.

使用的建议?

  1. var配合匿名类型使用
  2. var偷懒,配合复杂类型时使用。
  3. 在不知道具体什么类型的时候就可以使用var来声明

缺陷

在代码阅读的时候,不是很方便。

建议在大家写代码的时候,尽量明确类型。

扩展方法

为什么需要扩展方法?

  1. 扩展:让功能变得更加强大,让不存在功能存在. ---新增逻辑处理
  2. 已经存在方法,正常调用,扩展的东西不影响已经存在的方法
  3. 如果需求变更,需要支持另外的一个新的功能。

接着上面学生的用例,我们可以追加一些需求.

Student student1 = new Student()
{Id = 1,ClassId = 2,Name = "张三",Age = 20,Description = "这是一个学生"
};student1.Study();
student1.StudyQt();

如果要增加一个需求--学习嵌入式---直接增加方法.
传统的方式对原有的类进行结构上的修改.

期望:既可以增加新的功能,历史代码不变.直接增加类,在新的类中去完成.

这里就可以使用扩展方法来完成需求.

 public static class MethodExtension{public static void StudyEmbedded(this Student student){Console.WriteLine($"{student.Id} {student.Name} 跟着老师学习嵌入式开发");}}

program.cs

student.StudyEmbedded();

可以看到做的操作就是:

  1. 把类变成静态类
  2. 把方法的第一个参数+this修饰

这样就完成了一个扩展方法.静态方法的调用--可以像实例方法一样去调用.

不用修改原有的任何类中的类,可以新增功能;

有哪些场景?

  1. 有新的需求来的时候--扩展方法--保证历史代码功能
  2. 要应用第三方的DLL库(提供的功能不完善,我们自己需要升级下----dll,不能修改原有的代码)扩展方法
  3. 封装帮助类库
  4. asp.net core 中,到处都是扩展方法--框架的设计--最小化设计.提供一个最基本、最最最简单的功能,提供给调用方.这种方式在使用的时候,如果想要增强功能,就可以扩展. 好处:
    1. 尽可能简化代码
    2. 灵活分配,需要就扩展什么.按需扩展,不会有代码冗余.

这里有个问题,我可以给任意类型写扩展方法嘛? 注意:扩展object类型.

 public static string SubObj(this object str, int len = 10){if (str is null){return string.Empty;}if (str.ToString().Length <= 10){return str.ToString();}else{str = $"{str.ToString().Substring(0, len)}....";return str.ToString();}}

program.cs

 object o = "object 类型";o.SubObj();int i = 1;i.SubObj();//可以string sr = "你好";sr.SubObj();str.SubGeneric();student.SubGeneric(); //隐患

总结:

  1. 扩展的类型具有继承性,扩展父类,所有子类都拥有这个功能;扩展的功能可能不适用一些具体的类型;但是仍然可以调用;可以造成一些类型的功能的污染;----慎用
  2. 不建议扩展object,也不是很建议大家去泛型扩展.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/756545.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

蓝桥杯--完全二叉树

import java.util.Scanner;import static java.lang.Math.log;public class top9 {//求树的每一层的和public static void main(String [] args){Scanner scannernew Scanner(System.in);int nscanner.nextInt();int [] arrnew int[n];for(int i0;i<n;i){arr[i]scanner.next…

Android Studio实现内容丰富的安卓志愿者平台

获取源码请点击文章末尾QQ名片联系&#xff0c;源码不免费&#xff0c;尊重创作&#xff0c;尊重劳动 项目编号122 1.开发环境android stuido jdk1.8 eclipse mysql tomcat 2.功能介绍 安卓端&#xff1a; 1.注册登录 2.查看公告 3.查看岗位 4.浏览新闻&#xff0c; 5.个人中心…

1、Java虚拟机学习-类的生命周期-加载阶段-以及怎样查看方法区中的对象和堆中对象的关联以及静态变量存在什么地方

类的生命周期 其中连接又可以分为3个小阶段 一、加载阶段 1、加载阶段第一步是类加载器根据类的全限定名通过不同的渠道以二进制流的方式获取字节码信息。 渠道: 2、类加载器在加载完类之后&#xff0c;Java虚拟机会将字节码中的信息保存在内存的方法区中。 方法区是虚拟…

使用Vscode连接云进行前端开发

使用Vscode连接云进行前端开发 1、ssh连接腾讯云 本人使用的是腾讯云。 然后vscode,用最新版&#xff0c;插件选择remote ssh&#xff0c;或者remote xxx下载过来。 然后点击远程资源管理器&#xff0c;选择SSH通道 然后输入命令如下。 ssh rootip然后输入密码 腾讯云应该…

Source Insight使用-添加新的文件类型

目录 遇到的问题解决方法结果 遇到的问题 在Source Insight中我们通常查看.c和.h文件&#xff0c;当使用其查看.java 或者.hal等类型文件时&#xff0c;发现找不到 解决方法 以添加.hal文件为例: 选择Options 下面的File Type Options… 选项。 点击左侧的 “C/C Source F…

哈尔滨工业大学 《材料物理》 笔记-3

原内容请参考哈尔滨工业大学何飞教授&#xff1a;https://www.bilibili.com/video/BV18b4y1Y7wd/?p12&spm_id_frompageDriver&vd_source61654d4a6e8d7941436149dd99026962 或《材料物理性能及其在材料研究中的应用》&#xff08;哈尔滨工业大学出版社&#xff09; 量…

YOLOv9改进策略:卷积魔改 | 分布移位卷积(DSConv),提高卷积层的内存效率和速度

&#x1f4a1;&#x1f4a1;&#x1f4a1;本文改进内容&#xff1a; YOLOv9如何魔改卷积进一步提升检测精度&#xff1f;提出了一种卷积的变体&#xff0c;称为DSConv&#xff08;分布偏移卷积&#xff09;&#xff0c;其可以容易地替换进标准神经网络体系结构并且实现较低的存…

针对BSV区块链新推出的网络访问规则NAR和警报系统AS的解释与问答

​​发表时间&#xff1a;2024年2月22日 BSV区块链社区团队最近开设了一个Twitter&#xff08;X&#xff09;话题空间&#xff0c;讨论BSV区块链协会最新推出的网络访问规则和警报系统的相关问题。 本次讨论由BSV区块链社区负责人Brett Banfe主持&#xff0c;以便社区成员更好…

vivado 物理优化约束、交互式物理优化

物理优化约束 Vivado Design Suite在物理优化过程中尊重DONT_TOUCH特性。它不在具有这些属性的网络或小区上执行物理优化。要加快网络选择过程中&#xff0c;具有DONT_TOUCH属性的网络经过预过滤&#xff0c;不被考虑用于物理优化。此外&#xff0c;还遵守Pblock分配&#xff…

母亲的奶牛(bfs)

农夫约翰有三个容量分别为 A , B , C A,B,C A,B,C 升的挤奶桶。 最开始桶 A A A 和桶 B B B 都是空的&#xff0c;而桶 C C C 里装满了牛奶。 有时&#xff0c;约翰会将牛奶从一个桶倒到另一个桶中&#xff0c;直到被倒入牛奶的桶满了或者倒出牛奶的桶空了为止。 这一过…

Linux常用命令之搜索查找类

1.1find查找文件或目录 1&#xff09;基本语法 find [搜索范围] [ 选项] find -name&#xff1a;按照名字查找 find -user&#xff1a;按用户相关查找 find -size&#xff1a;按照文件大小查找 1.2locate快速定位文件路径 经验技巧&#xff1a;由于locate指令基于数据库进行…

HP Pavilion Laptop 15-eg2xxx原厂Win11系统预装oem系统包

惠普星15青春版笔记本原装出厂Windows11系统镜像下载&#xff0c;恢复出厂开箱状态 链接&#xff1a;https://pan.baidu.com/s/1f4hjwWX0CMDykb_8YXSf-w?pwd0aja 提取码&#xff1a;0aja 适用型号&#xff1a; 15-eg0010TU、15-eg0011TU、15-eg0008TX、15-eg0009TX 15-eg…

金属表面缺陷检测设备通常采用计算机视觉技术和机器学习算法

金属表面缺陷检测是在金属制造过程中非常重要的质量控制步骤。它涉及检测金属表面可能存在的各种缺陷&#xff0c;如裂纹、气泡、凹坑、氧化、斑点等。这些缺陷可能会影响金属制品的性能和质量&#xff0c;因此需要及早发现并进行处理。 目前&#xff0c;金属表面缺陷检测通常采…

从零开始写 Docker(六)---实现 mydocker run -v 支持数据卷挂载

本文为从零开始写 Docker 系列第六篇&#xff0c;实现类似 docker -v 的功能&#xff0c;通过挂载数据卷将容器中部分数据持久化到宿主机。 完整代码见&#xff1a;https://github.com/lixd/mydocker 欢迎 Star 推荐阅读以下文章对 docker 基本实现有一个大致认识&#xff1a; …

PriorityQueue集合源码分析

PriorityQueue集合源码分析 文章目录 PriorityQueue集合源码分析前置知识一、字段分析二、构造函数分析三、方法分析四、总结 PriorityQueue 优先级队列&#xff0c;是基于堆的结构来构建的。而堆是基于完全二叉树来实现的&#xff0c;而二叉树除了可以用节点来实现也可以用数组…

elementary OS7 (Ubuntu 22.04)中word文档转化成pdf格式文档

elementary OS7 Ubuntu 22.04中word文档转化成pdf格式 背景目标操作 背景 收到一个word文档&#xff0c;让调整一下排版后转换一下格式&#xff0c;转换成pdf格式&#xff0c;这要是在windows系统下&#xff0c;office可以直接另存为pdf文档&#xff0c;在linux系统下没有offi…

基于Springboot的船运物流管理系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的船运物流管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构…

简单对已有云服务器进行linux环境搭建以及共享服务器

前言&#xff1a; 外壳程序&#xff1a;Xshell7 云服务器&#xff1a;华为云 服务器操作系统&#xff1a;centos7 1.云服务的设置&#xff08;这里购买的华为云&#xff0c;阿里腾讯都可以&#xff09; 区域尽量选择距离所处地距离自己最近的区域。镜像这里选择的为centos7.…

考研失败, 学点Java打小工_Day3_卫语句_循环

1 编码规范——卫语句 表达异常分支时&#xff0c;少用if-else方式。   比如成绩判断中对于非法输入的处理&#xff1a; /*>90 <100 优秀>80 <90 良好>70 <80 一般>60 <70 及格<60 不及格*/Testpu…

企业培训考试系统数字化解决方案优势有哪些?

企业员工内部培训考试系统&#xff0c;用数字技术和互联网平台&#xff0c;为企业提供高效、便捷、个性化的员工培训服务的解决方案。 企业员工培训考试数字化解决方案不仅能够提供更加高效、灵活和互动的学习体验&#xff0c;还能够帮助企业实现长期的人才发展战略&#xff0…