前言

微软昨天发布了新的VS 2017 ..随之而来的还有很多很多东西... .NET新版本 ASP.NET新版本...等等..太多..实在没消化..

分享一下其实2016年12月就已经公布了的C#7.0的新特性吧,虽然很早就出来了,但咱这IDE不支持啊..

不过在昨天的VS2017中已经完美可以支持使用了.

E文好的,移步官方介绍地址:https://docs.microsoft.com/zh-cn/dotnet/articles/csharp/csharp-7

先列一下相关的语法:

1.out-variables(Out变量)

2.Tuples(元组)

3.Pattern Matching(匹配模式)

4.ref locals and returns (局部变量和引用返回)

5.Local Functions (局部函数)

6.More expression-bodied members(更多的函数成员的表达式体)

7.throw Expressions (异常表达式)

8.Generalized async return types (通用异步返回类型)

9.Numeric literal syntax improvements(数值文字语法改进)

正文

1. out-variables(Out变量)

以前,我们使用out变量的时候,需要在外部先申明,然后才能传入方法,类似如下:

string ddd = ""; //先申明变量
ccc.StringOut(out ddd);
Console.WriteLine(ddd);

在C#7.0中我们可以不必申明,直接在参数传递的同时申明它,如下:

 StringOut(out string ddd); //传递的同时申明
Console.WriteLine(ddd);
Console.ReadLine();

2.Tuples(元组)

曾今在.NET4.0中,微软对多个返回值给了我们一个解决方案叫元组,类似代码如下:

 static void Main(string[] args)
{
var data = GetFullName();
Console.WriteLine(data.Item1);
Console.WriteLine(data.Item2);
Console.WriteLine(data.Item3);
Console.ReadLine();
}
static Tuple<string, string, string> GetFullName()
{
return new Tuple<string, string, string>("a", "b", "c");
}

上面代码展示了一个方法,返回含有3个字符串的元组,然而当我们获取到值,使用的时候 心已经炸了,Item1,Item2,Item3是什么鬼,虽然达到了我们的要求,但是实在不优雅

那么,在C#7.0中,微软提供了更优雅的方案:(注意:需要通过nuget引用System.ValueTuple)如下:

        static void Main(string[] args)
{
var data=GetFullName();
Console.WriteLine(data.a); //可用命名获取到值
Console.WriteLine(data.b);
Console.WriteLine(data.c);
Console.ReadLine(); } //方法定义为多个返回值,并命名
private static (string a,string b,string c) GetFullName()
{
return ("a","b","c");
}

解构元组,有的时候我们不想用var匿名来获取,那么如何获取abc呢?我们可以如下:

 static void Main(string[] args)
{
//定义解构元组
(string a, string b, string c) = GetFullName(); Console.WriteLine(a);
Console.WriteLine(b);
Console.WriteLine(c);
Console.ReadLine(); } private static (string a,string b,string c) GetFullName()
{
return ("a","b","c");
}

3. Pattern Matching(匹配模式)

在C#7.0中,引入了匹配模式的玩法,先举个老栗子.一个object类型,我们想判断他是否为int如果是int我们就加10,然后输出,需要如下:

object a = ;
if (a is int) //is判断
{
int b = (int)a; //拆
int d = b+; //加10
Console.WriteLine(d); //输出
}

那么在C#7.0中,首先就是对is的一个小扩展,我们只需要这样写就行了,如下:

object a = ;
if (a is int c) //这里,判断为int后就直接赋值给c
{
int d = c + ;
Console.WriteLine(d);
}

这样是不是很方便?特别是经常用反射的同志们..

那么问题来了,挖掘机技术哪家强?!(咳咳,呸 开玩笑)

其实是,如果有多种类型需要匹配,那怎么办?多个if else?当然没问题,不过,微软爸爸也提供了switch的新玩法,我们来看看,如下:

我们定义一个Add的方法,以Object作为参数,返回动态类型

        static dynamic Add(object a)
{
dynamic data;
switch (a)
{
case int b:
data=b++;
break;
case string c:
data= c + "aaa";
break;
default:
data = null;
break;
}
return data;
}

下面运行,传入int类型:

object a = ;
var data= Add(a);
Console.WriteLine(data.GetType());
Console.WriteLine(data);

输出如图:

我们传入String类型的参数,代码和输出如下:

object a = "bbbb";
var data= Add(a);
Console.WriteLine(data.GetType());
Console.WriteLine(data);

通过如上代码,我们就可以体会到switch的新玩法是多么的顺畅和强大了.

匹配模式的Case When筛选

有的基友就要问了.既然我们可以在Switch里面匹配类型了,那我们能不能顺便筛选一下值?答案当然是肯定的.

我们把上面的Switch代码改一下,如下:

            switch (a)
{
case int b when b < :
data = b + ;
break;
case int b:
data=b++;
break;
case string c:
data= c + "aaa";
break;
default:
data = null;
break;
}

在传入-1试试,看结果如下:

4.ref locals and returns(局部变量引用返回)

已经补上,请移步:http://www.cnblogs.com/GuZhenYin/p/6531814.html

5.Local Functions (局部函数)

嗯,这个就有点颠覆..大家都知道,局部变量是指:只在特定过程或函数中可以访问的变量。

那这个局部函数,顾名思义:只在特定的函数中可以访问的函数(妈蛋 好绕口)

使用方法如下:

       public static void DoSomeing()
{
//调用Dosmeing2
int data = Dosmeing2(, );
Console.WriteLine(data);
//定义局部函数,Dosmeing2.
int Dosmeing2(int a, int b)
{
return a + b;
}
}

呃,解释下来 大概就是在DoSomeing中定义了一个DoSomeing2的方法,..在前面调用了一下.(注:值得一提的是局部函数定义在方法的任何位置,都可以在方法内被调用,不用遵循逐行解析的方式)

6.More expression-bodied members(更多的函数成员的表达式体)

C#6.0中,提供了对于只有一条语句的方法体可以简写成表达式。

如下:

        public void CreateCaCheContext() => new CaCheContext();
//等价于下面的代码
public void CreateCaCheContext()
{
new CaCheContext();
}

但是,并不支持用于构造函数,析构函数,和属性访问器,那么C#7.0就支持了..代码如下:

// 构造函数的表达式写法
public CaCheContext(string label) => this.Label = label; // 析构函数的表达式写法
~CaCheContext() => Console.Error.WriteLine("Finalized!"); private string label; // Get/Set属性访问器的表达式写法
public string Label
{
get => label;
set => this.label = value ?? "Default label";
}

7.throw Expressions (异常表达式)

在C#7.0以前,我们想判断一个字符串是否为null,如果为null则抛除异常,我们需要这么写:

        public string IsNull()
{
string a = null;
if (a == null)
{
throw new Exception("异常了!");
}
return a;
}

这样,我们就很不方便,特别是在三元表达式 或者非空表达式中,都无法抛除这个异常,需要写if语句.

那么我们在C#7.0中,可以这样:

        public string IsNull()
{
string a = null;
return a ?? throw new Exception("异常了!");
}

8.Generalized async return types (通用异步返回类型)

嗯,这个,怎么说呢,其实我异步用的较少,所以对这个感觉理解不深刻,还是觉得然并卵,在某些特定的情况下应该是有用的.

我就直接翻译官方的原文了,实例代码也是官方的原文.

异步方法必须返回 void,Task 或 Task<T>,这次加入了新的ValueTask<T>,来防止异步运行的结果在等待时已可用的情境下,对 Task<T> 进行分配。对于许多示例中设计缓冲的异步场景,这可以大大减少分配的数量并显著地提升性能。

官方的实例展示的主要是意思是:一个数据,在已经缓存的情况下,可以使用ValueTask来返回异步或者同步2种方案

    public class CaCheContext
{
public ValueTask<int> CachedFunc()
{
return (cache) ? new ValueTask<int>(cacheResult) : new ValueTask<int>(loadCache());
}
private bool cache = false;
private int cacheResult;
private async Task<int> loadCache()
{
// simulate async work:
await Task.Delay();
cache = true;
cacheResult = ;
return cacheResult;
}
}

调用的代码和结果如下:

        //main方法可不能用async修饰,所以用了委托.
static void Main(string[] args)
{
Action act = async () =>
{
CaCheContext cc = new CaCheContext();
int data = await cc.CachedFunc();
Console.WriteLine(data);
int data2 = await cc.CachedFunc();
Console.WriteLine(data2);
};
// 调用委托
act();
Console.Read(); }

上面的代码,我们连续调用了2次,第一次,等待了5秒出现结果.第二次则没有等待直接出现结果和预期的效果一致.

9.Numeric literal syntax improvements(数值文字语法改进)

这个就纯粹的是..为了好看了.

在C#7.0中,允许数字中出现"_"这个分割符号.来提高可读性,举例如下:

            int a = 123_456;
int b = 0xAB_CD_EF;
int c = ;
int d = 0xABCDEF;
Console.WriteLine(a==c);
Console.WriteLine(b==d);
//如上代码会显示两个true,在数字中用"_"分隔符不会影响结果,只是为了提高可读性

当然,既然是数字类型的分隔符,那么 decimalfloat 和 double  都是可以这样被分割的..

[干货来袭]C#7.0新特性(VS2017可用)的更多相关文章

  1. [干货来袭]C#7.0新特性(VS2017可用)(转)

    出处:http://www.cnblogs.com/GuZhenYin/p/6526041.html 微软昨天发布了新的VS 2017 ..随之而来的还有很多很多东西... .NET新版本 ASP.N ...

  2. [干货来袭]C#6.0新特性

    微软昨天发布了新的VS 2015 ..随之而来的还有很多很多东西... .NET新版本 ASP.NET新版本...等等..太多..实在没消化.. 分享一下也是昨天发布的新的C#6.0的部分新特性吧.. ...

  3. C#7.0新特性(VS2017可用)

    分享一下其实2016年12月就已经公布了的C#7.0的新特性吧,虽然很早就出来了,但咱这IDE不支持啊.. 不过在昨天的VS2017中已经完美可以支持使用了. E文好的,移步官方介绍地址:https: ...

  4. 干货 | 解读MySQL 8.0新特性:Skip Scan Range

    MySQL从8.0.13版本开始支持一种新的range scan方式,称为Loose Skip Scan.该特性由Facebook贡献.我们知道在之前的版本中,如果要使用到索引进行扫描,条件必须满足索 ...

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

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

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

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

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

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

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

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

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

随机推荐

  1. 判断移动端设备: navigator.userAgent.toLowerCase()

    判断你的浏览设备: navigator.userAgent.toLowerCase(); (返回当前用户所使用的是什么浏览器,将获得的信息变成小写) function browserRedirect( ...

  2. 在vue-cli项目中安装node-sass

    1,使用save会在package.json中自动添加. ----npm install node-sass  --save ----npm install sass-loader  --save 2 ...

  3. 编译安装mysql-server5.6.32手记

    起因: CentOS内置源里面默认安装的Mysql-server太老旧,不支持一些新方法的调用,需要重新安装一个新版本 老版本里面有数据,不想卸载,想保留库和软件本身 机器上没有运行Docker,而且 ...

  4. 导入礼包时,遇到file_get_contents读取的文本,去除空格、换行等的方法

    解决方法:正则替换: 代码:$gift_code_str = preg_replace('/((\s)*(\n)+(\s)*) /i ',',',file_get_contents($gift_cod ...

  5. jQuery Deferred和Promise的使用介绍:

    deferred对象是从jquery1.5.0引入的一个新对象,ES6也引入了Promise的正式规范. 抽象来说,deferreds 可以理解为表示需要长时间才能完成的耗时操作的一种方式,相比于阻塞 ...

  6. [TPYBoard-Micropython之会python就能做硬件 3] 制作电子时钟

    转载请注明:@小五义 http://www.cnblogs.com/xiaowuyi 欢迎加入讨论群 64770604 一.本次实验所需器材 1.TPYboard V102板  一块 2.DS3231 ...

  7. PHP接入芝麻信用续。

    前面,做好了,PHP查询芝麻信用. 客户又要求说,芝麻官方,发来邮件,还需要提交网站的数据给芝麻, 就是说接入芝麻SDK,还有一步,就是数据反馈. 大概芝麻分就是根据这些反馈的数据来计算的吧. 不多说 ...

  8. EntityFramewok Core 1.1连接MSSql数据库详解

    最近在研究ASP.NET Core,其中就用到了Entity Framework Core,对于Entity Framework Core连接SqlServer数据库,使用Code Frist创建数据 ...

  9. java 文件操作 读取字节级数据(读取)

    package com.swust; import java.io.*; /* * 功能:按照双精度浮点型.整型.布尔型.字符型.和字符串型的顺序从名为sample.dat文件读取数据 * 分析:用F ...

  10. Java ArrayList小程序理解

    package Collection; import java.util.ArrayList; import java.util.Iterator; //import javax.xml.crypto ...