C#中动态类型dynamic用法浅析
动态类型dynamic是微软在.net framework 4.0开始引入的,其目的是在程序编译过程中忽略对类型的检查,等到运行时刻再明确定义的对象的类型。
使用dynamic类型可以简化代码。如下面代码所示,有学生类型Student,包括多种属性定义。
public class Student{public string Name;//姓名public int Age;//年龄public string Sex;//性别public string Address;//住址public string Grade;//年级public string PhoneNumber;//电话号码}
现在需要做的是根据用户的输入条件在一组学生数据中进行数据过滤。如果用户输入的条件为空,则返回所有数据,如果不为空,则返回满足条件的学生信息。不用返回每个学生的所有信息,只要有姓名、性别和住址即可。
最初的解决方式如下所示,根据条件是否为空,分别对学生信息集合进行处理,并返回及显示匿名对象集合。但是这段代码的问题是if和else中存在有重复代码,即显示检索结果那段是重复的。
string gradeFilter = Console.ReadLine();if (string.IsNullOrEmpty(gradeFilter)){var result = from g in m_studentsselect new { Name = g.Name, Sex = g.Sex, Address = g.Address };foreach (var item in result){Console.WriteLine(string.Format("{0}-{1}-{2}", item.Name, item.Sex, item.Address));}}else{var result = from g in m_studentswhere g.Grade==gradeFilterselect new { Name = g.Name, Sex = g.Sex, Address = g.Address };foreach (var item in result){Console.WriteLine(string.Format("{0}-{1}-{2}", item.Name, item.Sex, item.Address));}}Console.ReadKey();
由于没有办法将var result的定义提前到if语句之前(VS:隐式类型化的变量必须已初始化),也没法将null值赋予result(VS:无法将<null>赋予隐式类型化的变量)。首先想到的解决办法是再定义一个学生信息类,只包括姓名、性别和住址三个属性,然后替换linq语句中的匿名对象。
这样虽然能够解决问题,但是却增加了代码量。这是就可以使用dynamic动态类型。
关于dynamic动态类型的详细介绍可以查看参考文献1-4。简而言之,使用dynamic动态类型定义的对象:“变量的使用和对其成员的引用绕过编译时类型检查。 改为在运行时解析这些操作”。也就是说VS在编译时不会去检查dynamic动态类型定义的对象以及对对象属性的操作,而是在程序运行时再去明确对象的具体类型。
于是将上述示例代码修改为以下方式,将result定义为dynamic动态类型,同时将显示过滤结果的代码放到最后,删除重复代码。程序的运行效果与上面的示例代码效果相同。
dynamic result;string gradeFilter = Console.ReadLine();if (string.IsNullOrEmpty(gradeFilter)){result = from g in m_studentsselect new { Name = g.Name, Sex = g.Sex, Address = g.Address };}else{result = from g in m_studentswhere g.Grade==gradeFilterselect new { Name = g.Name, Sex = g.Sex, Address = g.Address };}foreach (var item in result){Console.WriteLine(string.Format("{0}-{1}-{2}", item.Name, item.Sex, item.Address));}Console.ReadKey();
上述内容是初步学习参考文献中关于dynamic动态类型的一些认识,理解的可能不全或有所偏颇,欢迎批评指正。
参考文献
[1]https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/builtin-types/reference-types#the-dynamic-type
[2]https://docs.microsoft.com/zh-cn/dotnet/api/system.dynamic.dynamicobject?view=net-5.0
[3]https://docs.microsoft.com/zh-cn/dotnet/csharp/programming-guide/types/walkthrough-creating-and-using-dynamic-objects
[4]https://www.dazhuanlan.com/2019/09/13/69ab7f586028/
C#中动态类型dynamic用法浅析相关推荐
- var和dynamic的应用 var、动态类型 dynamic 深入浅析C#中的var和dynamic ----demo
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- python中int函数的用法浅析_Python中int()函数的用法浅析
int()是Python的一个内部函数 Python系统帮助里面是这么说的 >>> help(int) Help on class int in module __builtin__ ...
- python中int用法,Python中int()函数的用法浅析
int()是Python的一个内部函数 Python系统帮助里面是这么说的 >>> help(int) Help on class int in module __builtin__ ...
- Java中var类型的用法
Java中var是Java10版本新出的特性,用它来定义局部变量. 使用var 定义变量的语法: var 变量名 = 初始值: 如果代码: var a = 20: var a =8.9: 这样的代码会 ...
- python中int函数的用法浅析_python中int函数怎么用,
详细内容 int() 函数用于将一个字符串会数字转换为整型.接下来通过本文给大家介绍python 中的int()函数的相关知识,感兴趣的朋友一起看看吧 int(x, [base]) 功能: 函数的作用 ...
- python中枚举类型enum用法_Python枚举类型Enum用法详解
实际开发中,我们离不开定义各种类型,当我们需要定义类型时,一般是通过一组整数来定义.比如:定义不同的月份 JAN 1 FEB 2 MAR 3 ... NOV 11 DEC 12 复制代码 大多数人想到 ...
- python中的defaultdict_简介Python的collections模块中defaultdict类型的用法
defaultdict 主要用来需要对 value 做初始化的情形.对于字典来说,key 必须是 hashable,immutable,unique 的数据,而 value 可以是任意的数据类型.如果 ...
- matlab中imadjust函数的用法,浅析matlab中imadjust函数
imadjust imadjust是一个计算机函数,该函数用于调节灰度图像的亮度或彩色图像的颜色矩阵.在matlab的命令窗口中键入: doc imadjust或者help imadjust即可获得该 ...
- 动态类型var和dynamic和传统确定类型区别和效率
伴随着vs2010的出现,c#4.0的诞生,与之而来的动态类型dynamic更是给net程序员们锦上添花,为自己的程序书写上带来了给大的便利.可到底怎么用,好不好用,效率这么样,也许是大家最迫切关注的 ...
最新文章
- Struts-Logic 标签库
- PS摩棒工具如何选中自己想要的区域
- sap开发-采购订单更改历史table
- java动态代理_Java 动态代理和依赖注入
- 静态链接库与动态链接库
- 基于几何距离的椭圆拟合
- cheatengine找不到数值_“不会找问题”,只配在底层,最高效的思维方式导图,人生开挂!...
- 【渝粤教育】国家开放大学2018年春季 8038-22T实用管理基础 参考试题
- 从零开始的Python学习Episode 19——面向对象(2)
- DNF单机版搭建(局域网、外网)
- 经过路由无法找到计算机,共享打印机找不到对方电脑解决方法
- Portapack应用开发教程(十三)控制遥控小车OOK
- 娑罗双树,半枯半荣,娑罗花开,盛者必衰
- CC2530基础实验:(2)外部中断控制LED亮灭
- 献给那些没有自信的人。
- 手动实现promise基础功能代码并测试自己写的promise库是否符合规范
- 操作系统:浅谈实模式,保护模式与长模式
- IAR下连仿真器可以正常运行,程序下载到flash部分功能异常
- 任何产品需求,挖到最后都是人性
- Linux 进程管理之进程调度与切换
热门文章
- --专访雷果国: 从1.5K到18K 一个程序员的5年成长之路--
- wr720n改无线打印服务器,tplink如何关闭dhcp
- java判断五张牌中有一对,五张同花顺概率,52张扑克牌,任取5张牌,求出现一对、两对、同花顺的概率。 请帮忙解决一下这道概率题,求详细的列出式......
- jquery html换行去掉,js/jquery去掉空格,回车,换行
- CSS-滚动条样式设置
- 2021年中国“夜猫”人群洞察报告
- 计算机系班级未来展望,对班级未来的展望总结
- 80 多个 Linux 必备的监控工具
- js删除cookie
- 欧姆龙PLC的模拟量控制方式