C#3.0智能的编译器
智能的编译器
在C#3.0中,编译器变的越来越智能,我们不用提供给它完整的信息,仅需要提供必要的信息,编译器就可以进行推断为我们补全未提供的信息
自动实现的属性
在之前我们生成一个类时需要有一个字段,但是字段一般不对外暴露,所以还会有一个对应的属性。类似下图

一个简单的name,我们就要写这么多代码,明显是让人沮喪的,而现在我们仅要下面这样一行简单的代码就可以,而在内部,实际上还是会有一个对应的字段,并且字段名看起来乱七八糟的,当然这是为了保证不会命名冲突,但是开发人员看不到啊,可以轻松的使用属性

隐式的局部变量
实际上我更喜欢说是类型推断,有时我们生明一个变量时,它的类型非常的长,比如下图,仅仅只是创建一个键值对,就要写这么长的代码。

如果使用了类型推断的话,我们可以使用var关键词来替换局部变量前面的类型,如下图 我们成功的简化了代码,但是实际上是编译器帮我们做了类型推断,鼠標放上去,可以看到类型还是Dictionary<string,string>。

和它的名称一样,隐式的局部变量仅可以在定义局部变量中使用,属性,字段都不可以。而且在表达式中我们必须明确的给定类型是什么。不可以是模拟两可的。也不可以为null
初始化器
初始化器分为对象初始化器与集合初始化器,在之前我们创建一个类的实例并为其成员赋值也是比如繁瑣的,如果没有構造函數的话我们无法在一个表达式中完成初始化操作。看起来应该如下图一样

而有了对象初始化器我们可以换一种写法,在后面加一个大括号,然后进行赋值即可。甚至可以发现小括号都被忽略了,当然这是有要求的,必须有无参的構造函數才可以。

当然,这也是编译器的功劳,编译后的代码,和我们之前并无区别。只是帮我们做了这些繁瑣的事
集合初始化器和上面是类似的,我们创建一个集合的时候,要调Add方法一个一个的赋值 ,现在一切变得简单起来

使用集合初始器只要类型有Add方法或者实现Ienumerable,为什么要有这个限制呢,因为还是编译器在背后帮我们一个一个的Add啊…..
隐式类型的数组
在创建一个数组的时候,我们要指定数组的类型,比如
Var array = new string[3]{"1","2","3"};
而现在写法变了,我们如果刚开始就初始化数组的话那么仅仅只要像下面这样就可以
Var array = new []{"1","2","3"}
编译器会要根据我们提供的项的类型进行推断,然后从而确定数组的话,当然我们给的所有项类型都要是一致的。
匿名类型
有时会有一种苦惱,我们需要一个简单的对象,并且只在一个地方使用一次。而又不得不为它去写一个类。现在这些得到了解决,就是匿名类型。
看看下图做了什么,我们创建了一个变量,但是它的类型是什么呢?在之前的理解中,这样是不对的,而现在它是匿名类型的。IDE也给了我们足够的提示,我们可以直接per.Name这样的去使用。

我们可以多次创建匿名类型,对于属性名相同,类型也相同的,编译器会为我们生成一个类。而属性名相同,类型不同的,会产生两个不同的类型,它们是同一个泛型类型生成的。
而我们写的那些属性,是只读属性,创建后,不可以再进行更改其值所以是不易变的也是线程安全的,
C#3.0智能的编译器的更多相关文章
- C#复习笔记(4)--C#3:革新写代码的方式(用智能的编译器来防错)
用智能的编译器来防错 本章的主要内容: 自动实现的属性:编写由字段直接支持的简单属性, 不再显得臃肿不堪: 隐式类型的局部变量:根据初始值推断类型,简化局部变量的声明: 对象和集合初始化程序:用一个表 ...
- PL/0与Pascal-S编译器程序详细注释
学校编译课的作业之一,要求阅读两个较为简单的编译器的代码并做注释, 个人感觉是一次挺有意义的锻炼, 将自己的心得分享出来与一同在进步的同学们分享. 今后有时间再做进一步的更新和总结,其中可能有不少错误 ...
- EOS Dawn 3.0 智能合约 -- 新格式
1.简介 随着EOS Dawn 3.0发布,智能合约的坑又要重新踩了o(╥﹏╥)o:3.0不仅将原来本身就在链里的基础合约独立出来,简单的介绍见3.0合约改变,合约的书写方式也有巨大变化,相比之前更加 ...
- 百度大脑UNIT3.0智能对话技术全面解析
智能客服.智能家居.智能助手.智能车机.智能政务……赋予产品智能对话能力是提升产品智能化体验.高效服务的重要手段,已经开始被越来越多的企业关注并布局.然而,智能对话系统搭建涉及NLP.知识图谱.语音等 ...
- 易普优APS 5.0高级计划排程系统助力工业4.0智能工厂建设
(一)智能工厂建设核心 <中国制造2025>明确提出要推进制造过程智能化,智能工厂是实现智能制造的重要载体.作为智能工厂,在生产过程应实现自动化.透明化.可视化.精益化的同时,产品检测.质 ...
- [读书笔记]C#学习笔记五: C#3.0自动属性,匿名属性及扩展方法
前言 这一章算是看这本书最大的收获了, Lambda表达式让人用着屡试不爽, C#3.0可谓颠覆了我们的代码编写风格. 因为Lambda所需篇幅挺大, 所以先总结C#3.0智能编译器给我们带来的诸多好 ...
- 【C++】动态内存与智能指针
C++常见的内存分配方式有三种: 从静态存储区分配,这里主要是存储局部static对象,类的static成员以及定义在函数之外的变量: 从栈内存分配,这里主要是存储函数内的非static对象: 从堆内 ...
- C#学习笔记四: C#3.0自动属性&匿名属性及扩展方法
前言 这一章算是看这本书最大的收获了, Lambda表达式让人用着屡试不爽, C#3.0可谓颠覆了我们的代码编写风格. 因为Lambda所需篇幅挺大, 所以先总结C#3.0智能编译器给我们带来的诸多好 ...
- C#3.0导航
C#3.0主要特性 智能的编译器 编译器,背后的默默付出者 Lamdba表达式与表达式树 匿名方法的革命 扩展方法 优雅的对类进扩展 (待完成) LINQ 还有这种操作? (待完成)
随机推荐
- centos6.5使用Google auth进行双因子认证
1.环境 系统:centos6.5 x86_64 [root@uu ~]# uname -a Linux uu 2.6.32-642.el6.x86_64 #1 SMP Wed Apr 13 00:5 ...
- 在python3中安装mysql扩展,No module named 'ConfigParser'
在python2.7中,我们安装的是 MySqldb或这 MySQL-python,能够正却安装,但在python3中,由于 其使用的扩展 ConfigParser 已经改名为 configpars ...
- S0.6 直方图均衡化
S0.6 直方图均衡化 直方图均衡化能提高图像的质量 累积直方图 这是后面均衡化所要知道的先验知识. 如果说直方图统计的是等于像素值的数量,那么累积直方图统计的就是小于等于像素值的数量 均衡化步骤 我 ...
- vue-cli利用router创建单页面
一.创建脚手架 第一步 打开命令输入vue init webpack-simple vue-name 下载webpack-simple (vue-name是你要创建的项目名称) 第二步 输入cd v ...
- centOS7.3安装配置NFS服务
在安装和运行NFS服务中,发现了一个需要警惕的地方. 运行2个centOS7.3系统.由于前面一篇已经写了使用xshell进行远程,所以,直接远程进行操作: chen-01做为服务端,chen-02做 ...
- xampp访问phpmyadmin访问不了
我的xampp版本是xampp-linux-x64-5.6.15-2-installer.run, 浏览器输入“我的ip/phpmyadmin”出现如下问题: Access forbidden! Ne ...
- github错误:fatal: remote origin already exists.
原文链接:http://blog.csdn.net/dengjianqiang2011/article/details/9260435 如果输入$ Git remote add origin git@ ...
- deepin 开机进入 initramfs,无法开机
原因 这个问题多是由于不正常关机造成文件系统出问题导致的 解决 fsck -t ext4 /dev/sda6 这个命令用于修复磁盘,一直选择y即可. 如果sda6 不行就换位sda1 再试. 执行完后 ...
- Android Gradle Task-中文
任务可以从根项目运行 Android 任务 androidDependencies-显示项目的Android依赖项 signingReport-显示基础和测试模块的签名信息 sourceSets-打印 ...
- Windows 查询端口占用
1.找到端口的进程ID(PID)(例如:8080) Windows系统: netstat -ao | find " Windows以外的其他平台: lsof -i: 2.杀死你找到的进程ID ...