C# 6.0新特性
因为在博客中给出的代码大多数都使用了C#6.0的新特性,如果各位对C#6.0还不了解,可以简单的看一下这篇随笔。o( ̄▽ ̄)d
先来看一个Point类

public class Point
{
public int X { get; set; } public int Y { get; set; } public Point(int x, int y)
{
X = x;
Y = y;
} public double Dist
{
get { return Math.Sqrt(X * X + Y * Y); }
} public override string ToString()
{
return String.Format("({0}, {1})", X, Y);
}
}

现在我们一步步来看在C#6.0中的改进
1->在以前版本的C#代码中所有的自动属性都必须有Setter,但是现在可以没有了。注意,不能只有Setter

public class Point
{
public int X { get; } public int Y { get; } public double Dist
{
get { return Math.Sqrt(X * X + Y * Y); }
} public override string ToString()
{
return String.Format("({0}, {1})", X, Y);
}
}

2->同时现在也可以为自动属性直接设置初值,无需放到构造函数中

public class Point
{
public int X { get; } = 2; public int Y { get; set; } = 1; public double Dist
{
get { return Math.Sqrt(X * X + Y * Y); }
} public override string ToString()
{
return String.Format("({0}, {1})", X, Y);
}
}

3->使用静态成员
3.1在上面的代码中看一看到调用Sqrt函数需要使用Math开头,写一次两次还好,如果一个类中大规模使用Sqrt每次都要先写一个Math会不会太麻烦了!
现在我们来看看如何改进。
首先在命名空间中添加下面这一行代码
using static System.Math;
规则是 using + static + 静态类命名空间
于是Dist属性就可改成下面这样
public double Dist
{
get { return Sqrt(X * X + Y * Y); }
}
3.2上面的规则也适用于枚举类型

using static Desktop.Color; namespace Desktop
{
enum Color
{
Yellow,
Red
} class Program
{
static void Main(string[] args)
{
Console.WriteLine(Yellow);
Console.ReadKey();
}
}
}

4->关于String.Format()方法的改进
这是经典写法
return String.Format("({0}, {1})", X, Y);
接下来一步步简化(先将String.Format用一个$代替)
return $"({0}, {1})", X, Y);
然后将0,1两个占位符直接换成X,Y
return $"({X}, {Y})";
好的化简完成。
5->对于Lambda表达式的改进
以前写匿名函数的时候可以写成一行,现在一般的函数也可以了
ToString()函数可以改写成如下形式
public override string ToString() => $"({X}, {Y})";
类似的属性可以改成这样
public double Dist => Sqrt(X * X + Y * Y);
注意属性是没有()的
简化后的Point类是这样的

public class Point
{
public int X { get; } = 2; public int Y { get; set; } = 1; public double Dist => Sqrt(X * X + Y * Y); public override string ToString() => $"({X}, {Y})";
}

6->索引初始化
先来看一段Json.Net的代码

public JObject ToJson()
{
var result = new JObject();
result["X"] = X;
result["Y"] = Y;
return result;
}

改进后的代码可以这么写

public JObject ToJson()
{
var result = new JObject()
{
["X"] = X,
["Y"] = Y
};
return result;
}

最终可以化简成一行代码
public JObject ToJson() => new JObject() { ["X"] = X, ["Y"] = Y };
7-> ?.运算符
?.运算符其实很简单,主要就是检查变量是否为null,如果不为null那就执行.
先来看一个函数,这个判断语句中大部分的检查都是在

public static Point FromJson(JObject json)
{
if (json != null &&
json["X"] != null &&
json["X"].Type == JTokenType.Integer &&
json["Y"] != null &&
json["Y"].Type == JTokenType.Integer
)
{
return new Point((int)json["X"], (int)json["Y"]);
}
return null;
}

这个函数可以用?.运算符化简成

public static Point FromJson(JObject json)
{
if (json != null &&
json["X"]?.Type == JTokenType.Integer &&
json["Y"]?.Type == JTokenType.Integer
)
{
return new Point((int)json["X"], (int)json["Y"]);
}
return null;
}

如果json["x"]为null,那么就不执行. 如果json["x"]不为null,那么就会执行.然后判断类型是否为int
所以代码可以被再次化简

public static Point FromJson(JObject json)
{
if (json?["X"]?.Type == JTokenType.Integer &&
json?["Y"]?.Type == JTokenType.Integer
)
{
return new Point((int)json["X"], (int)json["Y"]);
}
return null;
}

?.还有一个比较大的用处在触发事件的时候
OnChanged(this, args);
如果此时OnChanged为空显然是不行的所以呢,可以改写成这样
if (OnChanged == null)
{
OnChanged(this, args);
}
如果很不幸的另外一个线程就在判断之后,触发事件之前,再次设置OnChanged变为null,同样会导致错误
为了保证线程安全
需要先Copy一份,但是这样写显然就。。。
var onChanged = OnChanged;
if (onChanged != null)
{
onChanged(this, args);
}
现在可以改写成这样
OnChanged?.(this, args);
8-> 支持在catch和finally块中使用await
好滴以上就是C#6.0的一些新特性,这些改进个人感觉还是非常实用的!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 ...
随机推荐
- beego上传文件
html代码: <form id="fform" method="POST" enctype="multipart/form-data" ...
- 安装ClouderaManager以及使用ClouderaManager安装分布式集群的若干细节
目录 前言 整体介绍 分步安装介绍 总结 一.前言 周末干了近四十个小时中间只休息了五个小时终于成功安装了ClouderaManager以及分布式集群,其中各种辛酸无以言表,唯有泪两行. ...
- [c++] Exceptions
注意优先级关系,如下: try { throw logic_error{"blah"}; } catch (exception) { // caught here! // 有点if ...
- Windows Server 2008 R2 添加且制成“NFS服务器”角色后与Unix客户端匿名访问常见问题
在复杂的主机与网络环境中,我们可能会接触到多种主机与操作系统,配合Windows Server 2008 R2的原生“NFS服务器”功能可以让这样的复杂操作系统更方便应用. 然而面对网络上众多的帮助指 ...
- Linux快速配置集群ssh互信
之前在<记录一则Linux SSH的互信配置过程>.<Vertica 7.1安装最佳实践(RHEL6.4)>中,都分别提到了配置ssh互信的方法,本文在此基础上进一步整理配置s ...
- JS中的this
JS中的this 最近在学习JavaScript面向对象,其中有个难点就是关于this的问题. 关于this,我们要知道的两个问题,一个是this指向什么?另一个是this可以写在哪? 关于this的 ...
- Redis在windows下安装过程
一.下载windows版本的Redis 去官网找了很久,发现原来在官网上可以下载的windows版本的,现在官网以及没有下载地址,只能在github上下载,官网只提供linux版本的下载 官网下载地址 ...
- 进一步丰富和简化表单管理的组件:form.js
上文<简洁易用的表单数据设置和收集管理组件>介绍了我自己的表单管理的核心内容,本文在上文的基础上继续介绍自己关于表单初始值获取和设置以及表单数据提交等内容方面的做法,上文的组件粒度很小,都 ...
- Android Lint Checks
Android Lint Checks Here are the current list of checks that lint performs as of Android Studio 2.3 ...
- 纯CSS3实现动态火车行驶特效
上次开完飞机,这次开火车 查看效果:http://hovertree.com/texiao/css3/7/ 效果图: 代码如下: <!DOCTYPE html> <html> ...