博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C# 6.0新特性
阅读量:6269 次
发布时间:2019-06-22

本文共 3667 字,大约阅读时间需要 12 分钟。

因为在博客中给出的代码大多数都使用了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#团队辛苦咯!

 

每一个不曾追梦的日子都是对生命的辜负。

转载地址:http://mjlpa.baihongyu.com/

你可能感兴趣的文章
360项目-07
查看>>
使用Nginx进行TCP/UDP端口转发
查看>>
读书笔记2(Effective java)
查看>>
[bat]批量替换文件内容
查看>>
Java代码到字节码——第一部分
查看>>
Linux挂载安装VMware tool
查看>>
Android中利用ViewFliper实现屏幕切换效果
查看>>
群发quota报警邮件脚本
查看>>
C语言进阶【文件】常用文件操作函数详解(一)
查看>>
(四)基于Spring Cloud Fegin的跨服调用
查看>>
博为峰Java技术文章 ——JavaEE Hibernate实例状态
查看>>
RFC4291, IPv6 的单播地址到底是哪几种?
查看>>
Linux(centos)系统各个目录的作用详解 推荐
查看>>
zabbix监控进程与端口
查看>>
Libvirsh 问题:GLib-WARNING **: gmem.c:483: custom memory allocation vtable not supported
查看>>
COALESCE函数
查看>>
Ext.require callback 不执行
查看>>
面试题:连续子数组的最大和
查看>>
书生教你cocos2d-x-入门篇(一)
查看>>
Linux—yum环境的三种搭建方法
查看>>