先注明,本文主体参考自:C# 6.0新特性

目前代码中使用了很多C#6.0的新特性,下面以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,同样会导致错误

为了保证线程安全【可参考多线程下C#如何保证线程安全?

需要先Copy一份,但是这样写显然就。。。

var onChanged = OnChanged;
if (onChanged != null)
{
onChanged(this, args);
}

注:var onChanged = OnChanged;就是为了防止OnChanged被其它线程置为空。

现在可以改写成这样

OnChanged?.(this, args);

8-> 支持在catch和finally块中使用await

C# Note33: 总结C# 6.0/7.0 新特性的更多相关文章

  1. 有史来最大改变 Android 5.0十大新特性

    有史来最大改变 Android 5.0十大新特性 2014.10.16 14:51:31 来源:腾讯数码作者:腾讯数码 ( 0 条评论 )   距离Android系统上一次重大更新不到一年的时间,谷歌 ...

  2. C# 6.0可能的新特性及C#发展历程

    据扯,C# 6.0在不远的将来就发布了,对应的IDE可能是VS 2014(.Net Framework 5.0),因为VS 2013已于2013年10月份发布了,对应的是.Net Franework ...

  3. C# 6.0可能的新特性

    C# 6.0可能的新特性 1.主构造函数(Primary Constructors) 主构造函数给类中的变量赋值 Before public class Point { private int x, ...

  4. Spring Boot 2.0正式发布,新特性解读

    作者|翟永超 Spring Boot 2.0 来啦,有哪些新特性?升级吗? 写在前面 北京时间 3 月 1 日,经过漫长的等待之后,Spring Boot 2.0 正式发布.作为 Spring 生态中 ...

  5. C# 6.0可能的新特性及C#发展历程[转]

      C# 6.0可能的新特性及C#发展历程[转] 年10月份发布了,对应的是.Net Franework 4.5.1. 或者3年,更新增加的东西会比较多,所以对于C# 6.0,还是有一些期待的. 下面 ...

  6. MySQL 8.0.2复制新特性(翻译)

    译者:知数堂星耀队 MySQL 8.0.2复制新特性 MySQL 8 正在变得原来越好,而且这也在我们MySQL复制研发团队引起了一阵热潮.我们一直致力于全面提升MySQL复制,通过引入新的和一些有趣 ...

  7. Atitit.c# .net 3.5 4.0 4.5 5.0 6.0各个版本新特性战略规划总结

    Atitit.c# .net 3.5 4.0 各个版本新特性战略规划总结 1. --------------.Net Framework版本同CLR版本的关系1 2. paip.----------- ...

  8. c# .net 3.5 4.0 4.5 5.0 6.0各个版本新特性战略规划总结【转载】

    引用:http://blog.csdn.net/attilax/article/details/42014327 c# .net 3.5 4.0 各个版本新特性战略规划总结 1. ---------- ...

  9. 转载——C# 6.0可能的新特性及C#发展历程

    据扯,C# 6.0在不远的将来就发布了,对应的IDE可能是VS 2014(.Net Framework 5.0),因为VS 2013已于2013年10月份发布了,对应的是.Net Franework ...

  10. 【HANA系列】SAP HANA 1.0 SPS 11 新特性

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[HANA系列]SAP HANA 1.0 SPS ...

随机推荐

  1. python脚本后台启动

    nohup python -u test.py > out.log 2>&1 & nohup python -u 文件路径 > 打印日志 2>&1 &a ...

  2. Python之Requests库的7个主要方法

    方法 说明 requests.request() 构造一个请求,支撑一下各方法的基础方法 requests.get() 获取HTML网页的主要方法 requests.head() 获取网页头信息的方法 ...

  3. Jenkins控制台显示乱码

    方案: 解决控制台中文乱码问题: 点击左侧“系统管理”——右侧选择“系统设置”——“全局属性”,选择第一项:Environment variables,键值对列表,点击增加: 键:LANG 值:zh. ...

  4. vue.js鼠标经过和离开事件 mouseover mouseout

    每天学习一点点 编程PDF电子书.视频教程免费下载:http://www.shitanlife.com/code @mouseover="showEwm(1)" @mouseout ...

  5. 转载 1-EasyNetQ介绍(黄亮翻译) https://www.cnblogs.com/HuangLiang/p/7105659.html

    EasyNetQ 是一个容易使用,坚固的,针对RabbitMQ的 .NET API. 假如你尽可能快的想去安装和运行RabbitMQ,请去看入门指南.EasyNetQ是为了提供一个尽可能简洁的适用与R ...

  6. metamask的使用

    Metamask 我是在火狐浏览器安装它的,所以一开始安装了Firefox:http://www.firefox.com.cn/ 然后是下载metamask,它的官方网站是https://metama ...

  7. Python+Pycharm—学习—pip

    1.pip是干什么的? 2.pip怎么安装? 3.pip怎么用?

  8. a,b,c为3个整型变量,在不引入第四个变量的前提下写一个算法实现 a=b b=c c=a?(异或解决值互换问题)

    package com.Summer_0424.cn; /** * @author Summer * a,b,c为3个整型变量,在不引入第四个变量的前提下写一个算法实现 a=b b=c c=a? */ ...

  9. A2D JS框架 - DES加密解密 与 Cookie的封装(C#与js互相加密解密)

    这次实现了JS端的DES加密与解密,并且C#端也能正确解析DES的密文(反之也实现了) 使用的代码如下,非常方便: <script src="A2D.js" type=&qu ...

  10. Leetcode 143. Reorder List(Medium)

    Given a singly linked list L: L0→L1→…→Ln-1→Ln,reorder it to: L0→Ln→L1→Ln-1→L2→Ln-2→… You must do thi ...