C# 之 6.0 新特性
VS2015内置的C#版本为6.0,学习了一下C#6.0的新特性。
特性1:自动属性初始化 (Initializers for auto-properties)
以前我们是这么写的
public string _id = "id";
public string Id {
get { return _id; }
set { this._id = value; }
}
现在我们可以这样写
public string _id { get; set; } = "id";
特性2:只读属性的初始化(Getter-only auto-properties)
像用户ID这种只读属性,我们以前是这样写的
public class User
{
public User(string id)
{
this._id = id;
} public readonly string _id;
public string Id
{
get { return _id; }
}
}
现在可以这样
public class User
{
public User(string id)
{
Id = id;
}
public string Id { get; }
}
只读属性可以和标了readonly的字段一样在构造函数里面赋值。
特性3:用Lambda作为函数体 (Expression bodies on method-like members)
public class User
{
public string Id { get; set; }
public string Name { get; set; } public override string ToString()
{
return string.Format("Id:{0},Name:{1}", Id, Name);
}
}
现在我们可以这么写
public class User
{
public string Id { get; set; }
public string Name { get; set; } public override string ToString() => string.Format("Id:{0},Name:{1}", Id, Name);
}
特性4:Lambda表达式用作属性 (Expression bodies on property-like function members)
public class User
{
public string firstName { get; set; }
public string lastName { get; set; }
public string fullName {
get { return string.Format("{0}{1}", firstName, lastName); }
}
}
这种用法同样可以用于属性
public class User
{
public string firstName { get; set; }
public string lastName { get; set; }
public string fullName => string.Format("{0}{1}", firstName, lastName);
}
特性5:字符串嵌入值 (String interpolation)
这个叫法有点怪,看个例子就明白了,上面那个string.Format其实可以这样写,不仅写起来方便,而且可读性也非常好。
public class User
{
public string firstName { get; set; }
public string lastName { get; set; }
public string fullName => "\{firstName}\{lastName}";
}
如果要用到格式控制,和以前一样加上就可以了。
特性6:Using静态类 (Using static)
如果一个静态类里面是一堆方法,比如Math 可以不用写类名,直接调用他的静态方法

有人说这有破坏面向对象的嫌疑,我倒觉得这让C#在函数式编程上更进一步,至于到底是怎样,time will tell.
值得一提的是,这种using 也会引入扩展方法,之前using System.Linq 会把这个命名空间下所有的扩展方法引入,如果只需要一部分 (比如Enumerable),这种用法会很方便。
特性7:空值判断 (Null-conditional operators)

现在可以这样写

从这里也可以看出这种操作符的一个规则:如果对象为空,则整个表达式的值为空。
后面的成员访问不限于方法,还可以是属性,索引器等。
给个实际应用的例子,在触发事件时,经常见到这样的写法,一个委托在调用前总是要判断是否为空

现在可以这样

如果PropertyChanged为null,那这句就什么也不做。
特性8:nameof表达式 (nameof expressions)
在方法参数检查时,经常会见到这样的代码

里面有那个role是我们手写的字符串,在给role改名时,很容易把下面的那个字符串忘掉,C#6.0解决了这个问题,看看新写法

特性9:带索引的对象初始化器 (Index initializers)
对象初始化器在C#3.0就已经有了,C#6.0的对象初始化器加入了对索引器的支持,使得字典一类的东西也可以轻松初始化
这是一个Json.NET使用的例子

特性10:异常筛选器 (Exception filters)
这个在VB和F#中早就有的功能也加进来了,看看用法

在微软的文档中还给出了另一种用法,这个异常会在日志记录失败时抛给上一层调用者

特性11:catch和finally 中的 await (Await in catch and finally blocks)
这是另一个和异常相关的特性,使得我们可以在catch 和finally中等待异步方法,看微软的示例

特性12:无参数的结构体构造函数 (Parameterless constructors in structs)
在之前版本的C#中是不允许结构体拥有无参构造函数的,在C#6.0中是允许的,但需要注意一点,通过new得到的结构体会被调用构造函数,而通过default得到的不会调用
看看这个例子

首先是一个结构体,通过两种不同的方式创建,然后输出

不见的功能
Primary constructor和 out参数定义变量那个不见了,有说法是cut掉了,微软真是纠结
总体感觉C#6.0加入的更多是语法糖,语言本身没有太多新的概念,语法糖的加入会让C#程序员写出的代码更优美,更有生产力,希望C#越做越好!
C# 之 6.0 新特性的更多相关文章
- 浅谈Tuple之C#4.0新特性那些事儿你还记得多少?
来源:微信公众号CodeL 今天给大家分享的内容基于前几天收到的一条留言信息,留言内容是这样的: 看了这位网友的留言相信有不少刚接触开发的童鞋们也会有同样的困惑,除了用新建类作为桥梁之外还有什么好的办 ...
- Java基础和JDK5.0新特性
Java基础 JDK5.0新特性 PS: JDK:Java Development KitsJRE: Java Runtime EvironmentJRE = JVM + ClassLibary JV ...
- Visual Studio 2015速递(1)——C#6.0新特性怎么用
系列文章 Visual Studio 2015速递(1)——C#6.0新特性怎么用 Visual Studio 2015速递(2)——提升效率和质量(VS2015核心竞争力) Visual Studi ...
- atitit.Servlet2.5 Servlet 3.0 新特性 jsp2.0 jsp2.1 jsp2.2新特性
atitit.Servlet2.5 Servlet 3.0 新特性 jsp2.0 jsp2.1 jsp2.2新特性 1.1. Servlet和JSP规范版本对应关系:1 1.2. Servlet2 ...
- 背水一战 Windows 10 (1) - C# 6.0 新特性
[源码下载] 背水一战 Windows 10 (1) - C# 6.0 新特性 作者:webabcd 介绍背水一战 Windows 10 之 C# 6.0 新特性 介绍 C# 6.0 的新特性 示例1 ...
- C# 7.0 新特性2: 本地方法
本文参考Roslyn项目中的Issue:#259. 1. C# 7.0 新特性1: 基于Tuple的“多”返回值方法 2. C# 7.0 新特性2: 本地方法 3. C# 7.0 新特性3: 模式匹配 ...
- C# 7.0 新特性1: 基于Tuple的“多”返回值方法
本文基于Roslyn项目中的Issue:#347 展开讨论. 1. C# 7.0 新特性1: 基于Tuple的“多”返回值方法 2. C# 7.0 新特性2: 本地方法 3. C# 7.0 新特性3: ...
- C# 7.0 新特性3: 模式匹配
本文参考Roslyn项目Issue:#206,及Docs:#patterns. 1. C# 7.0 新特性1: 基于Tuple的“多”返回值方法 2. C# 7.0 新特性2: 本地方法 3. C# ...
- C# 7.0 新特性4: 返回引用
本文参考Roslyn项目中的Issue:#118. 1. C# 7.0 新特性1: 基于Tuple的“多”返回值方法 2. C# 7.0 新特性2: 本地方法 3. C# 7.0 新特性3: 模式匹配 ...
- C#发展历程以及C#6.0新特性
一.C#发展历程 下图是自己整理列出了C#每次重要更新的时间及增加的新特性,对于了解C#这些年的发展历程,对C#的认识更加全面,是有帮助的. 二.C#6.0新特性 1.字符串插值 (String In ...
随机推荐
- host, nslookup, dig、whois
一.host命令:DNS 查找使用程序 选项与参数: -a :代表列出该主机所有的相关信息,包括 IP.TTL 与除错讯息等等 -l :若后面接的那个 domain 设定允许 allow-transf ...
- softmax详解
原文地址:https://blog.csdn.net/bitcarmanlee/article/details/82320853 1.softmax初探 在机器学习尤其是深度学习中,softmax是个 ...
- windows类书的学习心得
原文网址:http://www.blogjava.net/sound/archive/2008/08/21/40499.html 现在的计算机图书发展的可真快,很久没去书店,昨日去了一下,真是感叹万千 ...
- python连接kafka生产者,消费者脚本
# -*- coding: utf-8 -*- ''''' 使用kafka-Python 1.3.3模块 # pip install kafka==1.3.5 # pip install kafka- ...
- hue的历史查询记录querys乱码问题解决
hue的历史查询记录querys乱码问题解决: master1中配置文件/home/hadoop/.versions/hue-3.10.0/desktop/conf/hue.ini 可以看到连接的是m ...
- percona-xtrabackup工具实现mysql5.6.34的主从同步复制
percona-xtrabackup工具实现mysql5.6.34的主从同步复制 下载并安装percona-xtrabackup工具 # wget https://www.percona.com/do ...
- Ex 7_17 考虑如下的网络(其中数字为对应边的容量)...第十三次作业
(a) 利用ford-fulkerson算法即可求出最大流和最小分割. (b) 剩余网络为 由S可达的顶点为A.B.可达T的顶点为C. (c) 瓶颈边有e(A,C),e(B,C). (d) 下图中不包 ...
- Python中join()函数方法
函数:string.join() Python中有join()和os.path.join()两个函数,具体作用如下: join(): 连接字符串数组.将字符串.元组.列表中的元素以指定的字 ...
- Golang并发模型之Context详解
对于 Golang 开发者来说context(上下文)包一定不会陌生.但很多时候,我们懒惰的只是见过它,或能起到什么作用,并不会去深究它. 应用场景:在 Go http 包的 Server 中,每一个 ...
- liunx 安装 mysql 5.6
第一步 解压文件 目录切换到/usr/local/ cd /usr/local/ 解压 tar zxvf mysql-5.6.33-linux-glibc2.5-x86_64.tar.gz 重命名为 ...