C#的隐式类型、匿名类型、自动属性、初始化器
1.隐式类型
1)源起
在隐式类型出现之前,我们声明一个变量时,需要为它指定相应的类型,甚至在foreach一个集合的时候,也要为遍历的集合元素,指定变量的类型,隐式类型出现后,程序员就不用再做这个工作了。
2)使用方法
来看看下面的代码:
var a=1;//int a=1;var b="123";//string b="123";var myObj=new MyObj();//MyObj myObj=new MyObj();
上面的每行代码,与后面的注释起到的作用完全一样。也就是说,在声明一个变量(并且同时给它赋值)的时候,完全不用指定变量的类型,只要一个var就可以解决问题。
3)这样做会降低性能吗?
不会!上面的代码和注释里的代码,编译后产生的IL代码(中间语言代码)是完全一样的(编译器会根据变量的值,推导出变量的类型,才产生IL代码)
4)这个关键字的好处:
在foreach一个集合时,可以使用var关键字代替书写循环变量的类型;(其它待发现。。)
5)注意事项
你不能用var关键字声明变量时不给它赋值,因为编译器无法推导出变量的类型。
2.匿名类型
1)源起
创建一个对象,一定要先定义这个对象的类型吗?不一定,看看下面的代码
2)使用
var oddsAndEnds = new[]{new {Name="MVC" , Category="Pattern"},new {Name="Hat" , Category="Clothing"},new {Name="Apple" , Category="Fruit"}};StringBuilder result = new StringBuilder();foreach (var item in oddsAndEnds) {result.Append(item.Name).Append(" ");}
new关键字之后就直接为对象定义属性,并为这些属性赋值。而且,对象创建出来之后,在创建对象的方法中,还可以畅通无阻的访问对象的属性。
通过结合对象初始化器和类型推断,可以创建简答的数据存储对象,而不需要定义相应的类或结构。
3.自动属性
1)源起
为一个类定义属性,我们一般会写如下的代码
public class product{private string name;private int price;public string Name{get { return name; }set { name = value; }}public int Price{get { return price; }set { price = value; }}}
但很多时候,这些私有变量对我们一点用处都没有,比如对象关系映射中的实体类。自C#3.0引入了自动实现的属性,以上代码可以写成如下形式:
public class product{public string name { get; set; }public int price { get; set; }}
4.对象初始化器和集合初始化器
1)源起
我们创建一个对象并给它的属性赋值,代码一般写成这样子:
var product=new Product();product.name="小米";product.price=3;
自C#3.0引入对象初始化器,代码可以写成如下形式:
var product=new Product(){name="小米",price=3};
集合初始化器如下定义:
var arr=new List<int>(){1,2,3,4,5,6};
参考资料:
30分钟LINQ教程
精通ASP.NET MVC 4
C#的隐式类型、匿名类型、自动属性、初始化器的更多相关文章
- "元素隐式具有 “any” 类型,因为类型“Shared”没有索引签名"问题解决思路
最近在构建一个typescript项目时如下代码在项目框架里vscode报错元素隐式具有 "any" 类型,因为类型“Shared”没有索引签名;很有意思的是当我们单独的把这段代码 ...
- C#超级实用的一种类型—匿名类型
顾名思义 匿名类型就是没有名字的类型.当一个新的匿名对象定义与前面已经存在的类型定义的内部变量类型相同时,编译器就会只生成一个类定义,而不是各一个.匿名类型对象中仍然可以再包含匿名对象. 在C#3.0 ...
- C#超级有用的一种类型—匿名类型
顾名思义 匿名类型就是没有名字的类型.当一个新的匿名对象定义与前面已经存在的类型定义的内部变量类型同样时,编译器就会仅仅生成一个类定义,而不是各一个. 匿名类型对象中仍然能够再包括匿名对象. 在C#3 ...
- jQ的隐式迭代和设置样式属性
jQ中的隐式迭代 意义:不需要原生迭代了,在jQ内部自动帮你实现了循环 代码实现: let arr = document.querySelectorAll('li') for(let i = 0;i ...
- ts中提示“绑定元素“routes”隐式具有“any”类型”
思考单独的.ts和typescript框架在vscode层的差异,想想只有launch.json和tsconfig.json,一个个属性过去后,发现是tsconfig.json配置项"noI ...
- Linq之隐式类型、自动属性、初始化器、匿名类
目录 写在前面 系列文章 隐式类型 自动属性 初始化器 匿名类 总结 写在前面 上篇文章是本系列的小插曲,也是在项目中遇到,觉得有必要总结一下,就顺手写在了博客中,也希望能帮到一些朋友.本文将继续介绍 ...
- [C#详解] (1) 自动属性、初始化器、扩展方法
文章来源:Slark.NET-博客园 http://www.cnblogs.com/slark/p/CSharp-focus-1.html 代码下载:点我下载 目录 前言 属性与自动属性 属性 自动属 ...
- C#3.0新特性:隐式类型、扩展方法、自动实现属性,对象/集合初始值设定、匿名类型、Lambda,Linq,表达式树、可选参数与命名参数
一.隐式类型var 从 Visual C# 3.0 开始,在方法范围中声明的变量可以具有隐式类型var.隐式类型可以替代任何类型,编译器自动推断类型. 1.var类型的局部变量必须赋予初始值,包括匿名 ...
- .NET中那些所谓的新语法之一:自动属性、隐式类型、命名参数与自动初始化器
开篇:在日常的.NET开发学习中,我们往往会接触到一些较新的语法,它们相对以前的老语法相比,做了很多的改进,简化了很多繁杂的代码格式,也大大减少了我们这些菜鸟码农的代码量.但是,在开心欢乐之余,我们也 ...
- C#语法糖之第一篇:自动属性&隐式类型
今天给大家分享一下C#语法糖的简单的两个知识点吧. 自动属性:在 C# 4.0 和更高版本中,当属性的访问器中不需要其他逻辑时,自动实现的属性可使属性声明更加简洁. 客户端代码还可通过这些属性创建对象 ...
随机推荐
- 永久解决AndroidStudio Aapt2的问题
https://blog.csdn.net/qq_37280248/article/details/80142260 修改电脑c://user/王明 中文名去掉 https://www.jb51.ne ...
- 51Nod 1279 扔盘子 (思维+模拟)
题意: 有口井,往里扔盘子,最多扔多少个 n<=5e5, 1s 思路: 如果比较高的地方井口比较小,那么下面的再大也没有用,只需要维护一个单调减的数组然后O(n+m)模拟即可 代码: #incl ...
- kendo ui 好用的小部件--grid
Kendo Ui Grid控件,继承至Widget. https://demos.telerik.com/kendo-ui/grid/index 快速上手教程 下面的代码来自本教程 做表格时非常方 ...
- 一起了解 .Net Foundation 项目 No.1
.Net 基金会中包含有很多优秀的项目,今天就和笔者一起了解一下其中的一些优秀作品吧. 中文介绍 中文介绍内容翻译自英文介绍,主要采用意译.如与原文存在出入,请以原文为准. Akka.NET Akka ...
- JS代码格式化时间戳
一.[24小时制]yyyy-MM-dd HH:mm:ss new Date().toJSON() // 2019-12-13T13:12:32.265Z 通过上面的方法,基本就可以将日期格式化,然后稍 ...
- Fastjson <=1.2.62 远程代码执行-漏洞复现
影响范围: Fastjson<=1.2.62 需要开启autotype poc: String text1 = "{\"@type\":\"org.apa ...
- CodeForces 1B 模拟题。
H - 8 Time Limit:10000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u Submit Statu ...
- 线段树学习----C语言
/* 线段树学习:如果一个节点为i,那么他的左孩子为2I+1,右孩子为2i+2: */ #include<stdio.h> #define min(a,b) a<b?a:b; ]; ...
- codewars--js--Find The Parity Outlier
问题描述:(找出奇数数组中唯一的偶数,或是偶数数组中唯一的奇数) You are given an array (which will have a length of at least 3, but ...
- 浅谈centos8与centos7
距离centos8.0(现在已经更新到8.1了)的发布已经过去几个月了,作为一个刚刚接触过几个月centos的萌新来说,本文想通过实际的操作体验来说对比一下centos8代与7代 首先,centos8 ...