C#中的匿名类型

    这节来讲一下C#中的匿名类型。

匿名类

    在C#中,我们可以不去显示的声明一个类,而是通过匿名类去临时声明一个类结构去帮助我们去完成一些功能。

    声明一个匿名类,我们可以像下面这样做:

var Anonymous=new {name="charles",year=18};//声明匿名类对象

    需要注意的是,匿名类成员只能声明公共的只读属性,不能在匿名类中声明方法,因此匿名类的作用主要是承载类的数据,而非类的行为,也就是方法。由匿名类型实例化的对象则被成为匿名对象,匿名对象使用var关键字标识。比如说解析一条JSON数据,我们完全可以通过匿名类的形式去获取我们想得到的数据,请看如下代码:

string json = " { \"name\":\"charles\" , \"year\":18 ,\"address\":"shandong"}";
var jsonObj = JsonConvert.DeserializeAnonymousType(json, new{name = string.Empty,year = 0});
Console.WriteLine($"name is {jsonObj.name},year is {jsonObj.year}");

    这段代码使用了Newtonsoft.Json中的一个JSON转换方法,该方法可以将一条JSON转换为我们指定的匿名对象。如果没有匿名对象,我们需要创建一个类,去为了转换这一JSON,但是使用匿名类就简单许多,而且实际上我们只需要关注我们需要的属性即可,至于JSON中的其它对象,我们可以一概丢弃。   

    初此以外,我们在使用Linq方法Select()的使用,也可以用匿名类型:

//class AnonymousTemp
//{
//    public int Id { get; set; }
//    public string Name { get; set; }
//    public int Year { get; set; }
//}
List<AnonymousTemp>= new List<AnonymousTemp>();
list.Add(new AnonymousTemp() { Id = 1, Name = "Charles", Year = 18 });
list.Add(new AnonymousTemp() { Id = 2, Name = "Chiron", Year = 18 });
var aList = list.Select(u => new{id = u.Id,name = u.Name});foreach (var item in aList)
{Console.WriteLine($"name is {item.id},year is {item.name}");
}

     比如我们查到一组集合,我们只关心其中的几个属性(当然如果只需要取一个属性,则不需要匿名类,直接返回该属性值就可以了),就可以使用匿名类型。上述代码中 Select方法的参数,接受一个委托,也就引出了匿名方法,但是这个地方我用的并不是匿名方法,而是Lambda表达式,我们接着讲。

匿名方法(仅作了解)

    Select方法需要一个委托类型的参数,我们可以直接向里传入一个方法,传统的操作需要我们自己声明一个符合要求的委托,并且为这个委托传入方法,将这个委托作为参数传入Select方法中,但是后来为了简化操作,在C#2.0推出了匿名委托,匿名委托的结构为:

delegate (参数){//方法体}

这样上述Select方法用匿名方法的形式可以改写为如下形式:

var aList = list.Select(delegate (AnonymousTemp u)
{return new{id = u.Id,name = u.Name};
});

    这样看似是简单了许多,但是为了更加简单,在C#3.0微软推出了Lambda表达式,是对于匿名方法的进一步简化,从对比中我们也可以看出,Lambda表达式写起来要更爽一些。因此大家对于匿名方法可以仅做了解,而应该着重了解Lambda表达式的使用。

真的匿名?

    匿名方法真的匿名吗?为此,我们可以反编译一下这个项目,就能看到,无论是匿名类还是匿名方法,编译器在编译时都会为我们创建一个类,虽然我们写的少的,但编译器并没有少做:

    下图是编译器解析匿名类,为我们生成的真正的类代码:


7bcc7c8f412995f132f73be48f57c01f.png


    下图是编译器解析匿名方法和Lambda表达式,为我们生成的一个类,这个类里边是两个方法,分别对应我写的匿名方法和Lambda表达式,我们可以看出它们最终都被编译为一个委托:


258964027da887d97cda2f7748bf2c22.png


    但尽管如此,匿名类或者匿名方法也只能在其所在的上下文中使用,并不能跨作用域访问。

109534dfe3dedf083f49cfedf0bb37d4.jpeg

本节到此结束...

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

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

相关文章

MySQL之MHA高可用集群

目录 一、MHA概述 1.1.MHA 是什么 1.2.MHA 的组成 1.3.MHA 的特点 二、MHA搭建准备 2.1.实验思路 三、MHA搭建 3.1配置主从复制 3.2.安装 MHA 软件 3.3.故障模拟 3.4.故障修复 四、总结 一、MHA概述 1.1.MHA 是什么 1.MHA&#xff08;MasterHigh Availability&…

配置中心 App Configuration (一):轻松集成到Asp.Net Core

写在前面在日常开发中&#xff0c;我这边比较熟悉的配置中心有&#xff0c;携程Apollo&#xff0c;阿里Nacos(配置中心&#xff0c;服务治理一体)之前文章&#xff1a;Asp.Net Core与携程阿波罗(Apollo)的第一次亲密接触总体来说&#xff0c;Apollo和Nacos社区都比较活跃&#…

详解SpringMVC中Controller的方法中参数的工作原理[附带源码分析] good

目录 前言现象源码分析 HandlerMethodArgumentResolver与HandlerMethodReturnValueHandler接口介绍HandlerMethodArgumentResolver与HandlerMethodReturnValueHandler接口的具体应用常用HandlerMethodArgumentResolver介绍常用HandlerMethodReturnValueHandler介绍本文开头现象…

对不起,我不是一个自律的人

大家好&#xff0c;我是 &#x1f41f;&#x1f4a8;。前天&#xff0c;星球 的一位大学生朋友问了我几个问题&#xff1a;你大学时如何安排每日的时间&#xff1f;为什么能学那么多技术&#xff1f;你会学习到很晚吗&#xff1f;你是如何保持自律的&#xff1f;我觉得这几个问…

保证接口数据安全的10种方案

前言 大家好&#xff0c;我是程序汪&#xff0c;互联网项目需要特别注意数据安全&#xff0c;如果你简历上是互联网类型项目&#xff0c;安全方面肯定要能说出个一二三&#xff0c;下面分享下这方面的干货&#xff0c;大家可以记住几条&#xff0c;面试时好说道说道 我们日常…

Html5本地存储LocalStorage

HTML5 提供了两种在客户端存储数据的新方法&#xff1a; localStorage - 没有时间限制的数据存储sessionStorage - 针对一个 session 的数据存储在浏览器中打开审查元素&#xff08;如谷歌F12&#xff09;&#xff0c;在Resources下面可以查看里面的数据。 localStorage提供了几…

java第一季2.2

2019独角兽企业重金招聘Python工程师标准>>> 标识符&#xff1a; 是给变量类方法命名的符号、标识符开头可以_、字母、$命名&#xff0c;不可以用数字命名。关键字不可命名&#xff0c;大小写区分。不可以用非法字符 变量&#xff1a;变量类型。变量名。变量值。如&…

读《华为数字化转型之道》

数字化转型应该很多人都听过&#xff0c;但如果你做过 ToB 软件&#xff0c;听得更多的是信息化&#xff0c;那信息化和数字化是什么关系呢&#xff1f;下面用一个小例子来说说我的理解。记得刚上初中的时候&#xff0c;平时测验、考试的试卷&#xff0c;都是人工在板上进行刻写…

Thrift基本原理及使用

参考文章RPC 基本原理与 Apach Thrift 初体验 RPC基本原理 RPC(Remote Procedure Call)&#xff0c;远程过程调用&#xff0c;大部分的RPC框架都遵循如下三个开发步骤&#xff1a; 1. 定义一个接口说明文件&#xff1a;描述了对象(结构体)、对象成员、接口方法等一系列信息&am…

01-H5语义化标签

转载于:https://www.cnblogs.com/Zeki/p/5901399.html

配置中心 App Configuration (三):配置的动态更新

Get Azure key-value pairs from App configuration | Serverless360写在前面我在前文&#xff1a;《微软Azure配置中心 App Configuration (一)&#xff1a;轻松集成到Asp.Net Core》已经介绍了Asp.net Core怎么轻易的接入azure 配置中心App Configuration(下称azure 配置中心…

万字总结 JS 数据结构与常用的算法

前言 首先&#xff0c;为什么我会学习数据结构与算法呢&#xff0c;其实主要是有两方面 第一&#xff0c;是我在今年的flag里明确说到我会学这个东西第二&#xff0c;学了这些&#xff0c;对自己以后在工作或者面试也会带来许多好处然后&#xff0c;本文是最近学习的一个总结文…

精通Java设计模式从初见到相爱之工厂+策略模式(3)

为什么80%的码农都做不了架构师&#xff1f;>>> 1、公司项目需求。 用户签到活动&#xff0c;会员签到怎么处理&#xff0c;超级会员怎么处理&#xff0c;普通用户签到怎么处理&#xff0c;针对不同的档次&#xff0c;有不同的方案&#xff0c;所以在项目中用到了策…

jquery weui 中alert弹出框在ios中跳动问题

问题描述&#xff1a; jquery-weui中的弹出框在ios上会有一个右下角向中间滑动的效果&#xff0c;在Android上没有这个效果。 解决方法&#xff1a; 修该jquery-weui.js中的openModal方法如下图: 转载于:https://www.cnblogs.com/xianZJ/p/6773097.html

WPF效果第一百九十五篇之又玩ListBox

ListBox一直是我的最爱;今天再次基于他玩耍一下不一样的效果;闲话不多扯直接看效果:1、这次直接用的ItemContainerStyle:2、通过HitTest实现点选边框&#xff1a;Point point e.GetPosition(LightDarkListBox); VisualTreeHelper.HitTest(LightDarkListBox, new HitTestFilter…

Web3,互联网新造神“机器”?

本文来自微信公众号&#xff1a;每经头条 &#xff08;ID&#xff1a;nbdtoutiao&#xff09;&#xff0c;作者&#xff1a;李蕾&#xff0c;编辑&#xff1a;肖芮冬&#xff0c;头图来自&#xff1a;视觉中国 “与目前的互联网相比&#xff0c;Web3基于区块链等底层技术&#…

普通中年人的真实出路

阅读本文大概需要6分钟。互联网人甚至中国整体的用工市场的确有中年淘汰的问题&#xff0c;我们可以当它不存在&#xff0c;甚至当有人给出解法的时候&#xff0c;我们也可以认为他们在传播焦虑&#xff0c;但事实就是事实&#xff0c;它的存在不随个人意愿而转移。最近抖音上有…

项目管理常见的问题

综合管理 缺乏企业级的项目管理平台;项目目标不清楚;项目经理不了解项目管理流程和工具;项目模板不统一;计划意识薄弱&#xff0c;缺乏规范的分解。难以过程监控&#xff0c;实时地了解项目进度,靠手工统计和汇报项目进度&#xff0c;难以真实反映进度。项目控制不力&#xff0…

【温故知新】C# Linq中 Select SelectMany 使用技巧

微信公众号&#xff1a;趣编程ACE关注可了解更多的.NET日常实战开发技巧&#xff0c;如需源码 后台回复 源码 即可;如果觉得对你有帮助&#xff0c;欢迎关注C# Linq中 Select && SelectMany 使用技巧Select 和 SelectMany 是我们开发中对集合常用的两个扩展方法&#x…

bzoj4870

http://www.lydsy.com/JudgeOnline/problem.php?id4870 矩阵快速幂。。。 人话题意&#xff1a;从nk个物品里选模k余r个物品&#xff0c;问方案数模P 那么我们有方程 f[i][j]f[i-1][j]f[i-1][j-1] 跟组合数一个样子 j∈(0,k) 这个物品选还是不选加起来 构造矩阵&#xff1a;x.…