因为在博客中给出的代码大多数都使用了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. 条形码的应用三-----------从Excel文件中读取条形码

    条形码的应用三------从Excel文件中读取条形码 介绍 上一篇文章,我向大家展示了生成多个条形码并存储到Excel文件中的一个方法.后来我又有了个想法:既然条码插入到excel中了,我可不可以从 ...

  2. react-native 学习之Image篇

    /** * Sample React Native App * https://github.com/facebook/react-native */ 'use strict'; import Rea ...

  3. hibernate笔记--使用注解(annotation)方式配置单(双)向多对一的映射关系

    前面几篇都是介绍的用配置文件来实现实体类到数据库表的映射,这种方式是比较麻烦的,每一个pojo类都需要写一个相应的*.hbm.xml,无疑增加了很多代码量,不过也有优点就是利于维护,为了方便开发,Hi ...

  4. iOS-掌握了时间就掌握了一切!

    Demo下载地址 一. NSDate相关知识 1.获取当前时间 [NSDate date]; 注意: 获取的当前时间是世界时间:比我们用的时间慢8个小时. 2.世界时间转化为本地时间 - (void) ...

  5. mysql数据库去重复

    参考:http://www.cnblogs.com/duanjie/archive/2011/08/13/2136862.html 说到去重复,感觉逻辑很简单.但动手写起来却并不是那么容易.面试的时候 ...

  6. ApiController使用Session验证出现Null解决方案

    问题描述 在服务端保存登录信息,出现异常信息 分析发现HttpContext.Current.Session为null 解决方案 执行时出报异常,要在Global.asax里添加:开启Session功 ...

  7. SqlServer基础之(触发器)

    概念:   触发器(trigger)是SQL server 提供给程序员和数据分析员来保证数据完整性的一种方法,它是与表事件相关的特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触 ...

  8. cmd执行SQL语句

    首先新建txt文本,复制粘帖以下内容,保存为cmd执行SQL.bat.注意是bat文件 osql -S 服务器名称 -d 数据库 -U 登录名 -P 密码 -i 盘符:\文件夹\文件.sql

  9. 生成树形结构的json字符串代码(c#)供前端angular tree使用.

    框架是使用EF6.0.可以针对返回的值使用Newtonsoft.Json.dll(百度搜一下)来对返回的值序列化为json字符串,如果对以下值那就是使用JsonConvert.SerializeObj ...

  10. EC笔记,第二部分:7.为多态基类声明虚析构函数

    7.为多态基类声明虚析构函数 1.为多态基类声明虚析构函数 code1: class A{ public: int* a; A():a(new int(5)) {} ~A(){ delete a; } ...