因为在博客中给出的代码大多数都使用了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新特性的更多相关文章

  1. 浅谈Tuple之C#4.0新特性那些事儿你还记得多少?

    来源:微信公众号CodeL 今天给大家分享的内容基于前几天收到的一条留言信息,留言内容是这样的: 看了这位网友的留言相信有不少刚接触开发的童鞋们也会有同样的困惑,除了用新建类作为桥梁之外还有什么好的办 ...

  2. Java基础和JDK5.0新特性

    Java基础 JDK5.0新特性 PS: JDK:Java Development KitsJRE: Java Runtime EvironmentJRE = JVM + ClassLibary JV ...

  3. Visual Studio 2015速递(1)——C#6.0新特性怎么用

    系列文章 Visual Studio 2015速递(1)——C#6.0新特性怎么用 Visual Studio 2015速递(2)——提升效率和质量(VS2015核心竞争力) Visual Studi ...

  4. 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 ...

  5. 背水一战 Windows 10 (1) - C# 6.0 新特性

    [源码下载] 背水一战 Windows 10 (1) - C# 6.0 新特性 作者:webabcd 介绍背水一战 Windows 10 之 C# 6.0 新特性 介绍 C# 6.0 的新特性 示例1 ...

  6. C# 7.0 新特性2: 本地方法

    本文参考Roslyn项目中的Issue:#259. 1. C# 7.0 新特性1: 基于Tuple的“多”返回值方法 2. C# 7.0 新特性2: 本地方法 3. C# 7.0 新特性3: 模式匹配 ...

  7. C# 7.0 新特性1: 基于Tuple的“多”返回值方法

    本文基于Roslyn项目中的Issue:#347 展开讨论. 1. C# 7.0 新特性1: 基于Tuple的“多”返回值方法 2. C# 7.0 新特性2: 本地方法 3. C# 7.0 新特性3: ...

  8. C# 7.0 新特性3: 模式匹配

    本文参考Roslyn项目Issue:#206,及Docs:#patterns. 1. C# 7.0 新特性1: 基于Tuple的“多”返回值方法 2. C# 7.0 新特性2: 本地方法 3. C# ...

  9. C# 7.0 新特性4: 返回引用

    本文参考Roslyn项目中的Issue:#118. 1. C# 7.0 新特性1: 基于Tuple的“多”返回值方法 2. C# 7.0 新特性2: 本地方法 3. C# 7.0 新特性3: 模式匹配 ...

  10. C#发展历程以及C#6.0新特性

    一.C#发展历程 下图是自己整理列出了C#每次重要更新的时间及增加的新特性,对于了解C#这些年的发展历程,对C#的认识更加全面,是有帮助的. 二.C#6.0新特性 1.字符串插值 (String In ...

随机推荐

  1. 使用VS Code开发ASP.NET 5 应用程序

    本文简要地翻译了 https://code.visualstudio.com/Docs/runtimes/ASPnet5 并结合我的实践做了一些说明. 准备工作 1.安装VS Code  https: ...

  2. JDBC常用API小结

    建立数据库链接的三种方式: package com.victor_01; import java.sql.Connection; import java.sql.Driver; import java ...

  3. 附录B 安装MySql数据库

    B.1  卸载旧的MaySql程序 第一步   查找以前是否安装有mysql 使用命令查看是否已经安装过mysql: #rpm -qa | grep -i mysql 如果没有结果,则可以进行mysq ...

  4. table-cell实现宽度自适应布局

    利用table-cell可以实现宽度自适应布局. table-cell有一些比较好用的属性,比如垂直居中,自适应高度宽度等,为元素设置table-cell布局之后,元素的margin失效,paddin ...

  5. 一次发现underscore源码bug的经历以及对学术界『拿来主义』的思考

    事情是如何发生的 最近干了件事情,发现了 underscore 源码的一个 bug.这件事本身并没有什么可说的,但是过程值得我们深思,记录如下,各位看官仁者见仁智者见智. 平时有浏览园区首页文章的习惯 ...

  6. HTML 网页特效CSS大全

    css属性代码大全一CSS文字属性:color : #999999; /* 文字颜色*/font-family : 宋体,sans-serif; /* 文字字体*/font-size : 9pt; / ...

  7. Java进击C#——语法之面向对象

    本章简言 上一章笔者讲到关于ADO.NET相关的知识,知道了如何去访问数据库.本章将来讲关于面向对象的思想.不管在JAVA还是在C#面向对象思想的重要性都是占了一个很大的成份.往往他就像呼吸一样子,更 ...

  8. inno setup读取注册表遇到的一个坑

    一.背景 目前,公司针对PR开发的一个插件需要发布到64位系统上.该插件包括一个prm格式的文件和若干个DLL文件.其中,prm文件需要复制到PR公共插件目录下,DLL需要复制到Windows系统目录 ...

  9. Facebook Paper使用的第三方库

    Facebook Paper使用的第三方库 第三方库名 简介 链接 ACE code editor https://github.com/ajaxorg/ace Appirater 用户评分组件 ht ...

  10. android srudio使用HttpClient

    最近学习Android网络编程,在AndroidStudio下无法使用HttpClient,在网上找到了答案在这里记下来: //官方原文Apache HTTP Client RemovalAndroi ...