序
微软昨天发布了新的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 .输出变量(输出变量)
2.元组(元组)
3.模式匹配(匹配模式)
4.Reflocales和returns(局部变量和引用返回)
5.本地功能(本地功能)
6.更多的表达式主体成员(更多函数成员的表达式主体)
7 .抛出表达式(异常表达式)
8.通用异步返回类型(通用异步返回类型)
9.数字文字语法改进(数字文字语法改进)
主体
1.输出变量(输出变量)
过去,当我们使用out变量时,我们需要在传入方法之前从外部声明它,类似于下面的:
字符串ddd=//首先声明变量CCC . string go(outdd);控制台。write line(DDD);在C#7.0中,我们可以在传递参数的同时直接声明参数,如下:
StringOut(输出字符串DDD);//声明Console。传递时的write line(DDD);控制台。ReadLine();2.元组(元组)
一旦进入。NET4.0中,微软给了我们一个叫做tuple的多返回值的解决方案。类似的代码如下:
静态void Main(字符串[]args){ var data=GetFullName();控制台。WriteLine(数据。项目1);控制台。WriteLine(数据。第2项);控制台。WriteLine(数据。第3项);控制台。ReadLine();}静态Tuplesting,string,string GetFullName() {返回新的Tuplesting,string,string('a ',' b ',' c ');}上面的代码显示了一个返回包含三个字符串的元组的方法。然而,当我们得到价值并使用它时,我们的心已经爆炸了。第一项、第二项和第三项是什么?虽然符合我们的要求,但是真的不优雅
然后,在C#7.0中,微软提供了更优雅的解决方案:(注意:需要参考System。ValueTuple到nuget)如下:
静态void Main(字符串[]args){ var data=GetFullName();控制台。write line(data . a);//值Console。WriteLine(data.b)可以通过命名获得;控制台。write line(data . c);控制台。ReadLine();}//该方法被定义为多个返回值并命名为private static(字符串a、字符串b、字符串c) getfullname () {return ('a '、' b '、' c ');}解构元组,有时候我们不想用var匿名来获取它们,那么如何获取abc呢?我们可以按照:走
static void main(string[]args){//定义解构元组(字符串a、字符串b、字符串c)=getfullname();控制台。write line(a);控制台。write line(b);控制台。write line(c);控制台。ReadLine();}私有静态(字符串a,字符串b,字符串c) GetFullName() { return ('a ',' b ',' c ');}3.模式匹配在C#7.0中,介绍了模式匹配的游戏。首先,给出一个老栗子和一个对象类型。我们想判断它是否是整数。如果是int,我们会加10,然后输出。需要以下:
对象a=1;如果(a是int)//是judge { int b=(int)a;//移除int d=b 10//添加10控制台。write line(d);//输出}那么在C#7.0中,首先是is的一个小扩展,我们只需要这样写就可以了,如下:
对象a=1;如果(a为int c) //这里判断为int后直接赋给c { int d=C10;控制台。write line(d);}这样方便吗?尤其是经常用反思的同志.
那么问题来了,哪款挖掘机技术强?(咳咳,呸开玩笑)
实际上,如果有多种类型可以匹配呢?多重if否则?当然没问题,不过微软爸爸也提供了一个新的玩法switch。我们来看看,如下:
我们定义了一个Add方法,它将Object作为参数,并返回一个动态类型
静态动态添加(对象a) {动态数据;开关(a){ case int b : data=b;打破;案例字符串c: data=c ' aaa打破;default:数据=null打破;}返回数据;}在下面运行,传入int类型:
对象a=1;var数据=Add(a);控制台。WriteLine(数据。GetType());控制台。WriteLine(数据);输出如图3360所示
我们传入了字符串类型的参数,代码和输出如下:
对象a=' bbbbvar数据=Add(a);控制台。WriteLine(数据。GetType());控制台。WriteLine(数据);
通过上面的代码,我们可以体会到switch的新玩法是多么的流畅和强大。
过滤匹配模式时的情况
有些同志朋友会问。既然我们可以匹配Switch中的类型,那么我们可以顺便过滤这些值吗?答案当然是肯定的。
让我们更改上面的开关代码,如下所示:
当b 0:数据=b 100时,开关(a){ case int b;打破;case int b:数据=b;打破;案例字符串c: data=c ' aaa打破;default:数据=null打破;}尝试传入-1,看到的结果如下:
4.Reflocales和returns(局部变量和引用返回)
已经补充,请步骤:C# 7.0的Reflocales和Returns
5.本地功能(本地功能)
这有点颠覆性.众所周知,局部变量是指:个只能在特定过程或函数中访问的变量。
那么这个局部函数,顾名思义,只是一个可以在特定函数中访问的函数(母卵容易绕道)
用法如下:
public static void做某事(){//调用dosmeagin 2 int data=dosmeagin 2(100,200);控制台。WriteLine(数据);//定义本地函数,dosmeaing2。int dosmaining 2(int a,int b){ return a b;}}呃,解释了dosome 2中定义了dosome 2的方法,这个名字有点早。
(注意:值得一提的是,局部函数是在方法中的任何地方定义的,并且可以在方法中调用,而无需遵循逐行解析方法)
6.更多的表达式主体成员(更多函数成员的表达式主体)
在C#6.0中,只有一条语句的方法体可以缩写为表达式。
以下:
public void create CaCheContext()=new CaCheContext();//等效于以下代码:public void create cachecontext(){ new cachecontext();}但是,它不支持构造函数、析构函数和属性访问器,因此C#7.0支持它.代码如下:
//构造函数的表达式写成公共缓存上下文(字符串标签)=this。标签=标签;//析构函数~ cachecontext()=console . error . write line的表达式('已结束!');私有字符串标签;//Get/Set属性访问器的表达式写成公共字符串Label { get=labelset=this.label=value? '默认标签';}7 .抛出表达式(异常表达式)
在C#7.0之前,我们想判断一个字符串是否为空,如果为空,我们抛出异常。我们需要这样写:
公共字符串IsNull() {字符串a=nullif(a==null){引发新的异常(' Exception!');}返回a;}这样的话,对我们来说是非常不方便的,尤其是在三元表达式或非空表达式中,我们不能扔掉这个异常,需要编写if语句。
那么我们在C#7.0中,我们可以做到这一点:
公共字符串IsNull() {字符串a=null返回a?引发新的异常('异常!');}8.通用异步返回类型(通用异步返回类型)
嗯,嗯,怎么说呢?其实我异步用的比较少,所以对这种感觉理解不深。我仍然认为它应该在一些特定的情况下有用。
我会直接翻译官方原文,示例代码也是官方原文。
异步方法必须返回void、Task或TaskT。这一次,添加了一个新的值任务,以防止异步操作的结果在等待时可用时被分配给任务。对于许多示例中设计了缓冲的异步场景,这可以大大减少分配数量并显著提高性能。
官方示例主要是指:数据。缓存后,可以使用ValueTask返回异步或同步方案
公共类CaCheContext { public ValueTaskint CachedFunc(){ return(cache)?新值任务点(缓存结果):新值任务点(加载缓存());}私有bool缓存=falseprivate int cacheResult私有异步任务加载缓存(){ //模拟异步工作:等待任务。延迟(5000);cache=truecacheResult=100返回cacheResult}调用的代码和结果如下:
main方法不能被async修改,所以委托。static void main(string[]args){ action act=async()={ cachecontext cc=new cachecontext();int data=await cc。CachedFunc();控制台。WriteLine(数据);int data2=等待cc。CachedFunc();控制台。write line(data 2);};//调用委托act();控制台。read();}上面的代码被连续调用了两次。我们第一次等了5秒钟才看到结果。第二次,我们没有等到结果和预期效果一致。
9.数字文字语法改进(数字文字语法改进)
这纯粹是.为了好看。
在C#7.0中,' _ '被允许出现在数字中以提高可读性,例如:
int a=123 _ 456int b=0xAB _ CD _ EFint c=123456int d=0xABCDEF控制台。write line(a==c);控制台。write line(b==d);//上面的代码将显示两个true。在数字中使用“_”分隔符不会影响结果,只会提高可读性。当然,既然是数字类型的分隔符,小数、浮点和双精度都可以这样划分。
以上就是本文的全部内容。希望对大家的学习有帮助,支持我们。