C# 7.1、7.2特性追踪

作为Visual Studio 15.3的一部分,微软发布了自.NET 1.1以来C#的第一个单点版本。C# 7.1提供了三个新特性,其中有两个是成功有效的。

\u0026#xD;\n\u0026#xD;\n

C# 7.1/7.2:default字面量

\u0026#xD;\n\u0026#xD;\n

default字面量旨在减少一些样板代码。下面是一个常见的例子:

\u0026#xD;\n\u0026#xD;\n
public Task\u0026lt;Order\u0026gt; GetOrderAsync(int orderKey, CancellationToken token = default(CancellationToken))\u0026#xD;\n
\u0026#xD;\n\u0026#xD;\n

这多少有点啰嗦,因此,模仿Visual Basic的Nothing关键字,上述代码可以写成下面这样:

\u0026#xD;\n\u0026#xD;\n
public Task\u0026lt;Order\u0026gt; GetOrderAsync(int orderKey, CancellationToken token = default)\u0026#xD;\n
\u0026#xD;\n\u0026#xD;\n

这行代码可以按照预期方式运行。但是,当使用一个可空的值类型时,问题就来了。

\u0026#xD;\n\u0026#xD;\n
public Task\u0026lt;Order\u0026gt; GetOrders(int? limit = default)\u0026#xD;\n
\u0026#xD;\n\u0026#xD;\n

这行代码应该把limit参数置为空,但在C# 7.1中,它实际返回0。

\u0026#xD;\n\u0026#xD;\n

这个问题的修复计划在C# 7.2中进行,该版本会随Visual Studio 15.5一起发布。

\u0026#xD;\n\u0026#xD;\n

C# 7.1:元组名称推断\u0026#xD;\n\u0026#xD;\n
自从引入了匿名类型,C#就可以隐式命名属性。例如,在下面这行代码中,对象y会拥有名为AB的属性。

\u0026#xD;\n\u0026#xD;\n
var y = new { x.A, x.B };\u0026#xD;\n
\u0026#xD;\n\u0026#xD;\n

在C# 7.1中,值元组也具有这个特性。

\u0026#xD;\n\u0026#xD;\n
var z1 = (A: x.A, B: x.B); //显式名称\u0026#xD;\nvar z2 = (x.A, x.B); //推断名称\u0026#xD;\n
\u0026#xD;\n\u0026#xD;\n

要了解更多有关元组名称推断的信息,请看下我们之前的报道。

\u0026#xD;\n\u0026#xD;\n

C# 7.1:Async Main

\u0026#xD;\n\u0026#xD;\n

这里没有多少可说的。Main函数现在可以异步执行,这减少了之前需要编写的一些样板代码。

\u0026#xD;\n\u0026#xD;\n

C# 7.2:条件Ref

\u0026#xD;\n\u0026#xD;\n

C#的条件操作符通常被称为“三元运算符”,因为这是这门语言中的唯一一个。C# 7.2将会提供第二个三元操作符,名为条件Ref操作符。

\u0026#xD;\n\u0026#xD;\n

这个小特性让开发人员可以在条件中使用ref表达式。下面是提案中的一个例子:

\u0026#xD;\n\u0026#xD;\n
ref var r = ref (arr != null ? ref arr[0]: ref otherArr[0]);\u0026#xD;\n
\u0026#xD;\n\u0026#xD;\n

注意,除了在靠近两种可能结果的地方需要使用ref关键字外,在包含整个表达式的括号外也需要使用ref关键字。

\u0026#xD;\n\u0026#xD;\n

C# 7.2:起始分隔符

\u0026#xD;\n\u0026#xD;\n

该特性扩展了在数值字面量中使用下划线的能力。下面的示例摘自提案:

\u0026#xD;\n\u0026#xD;\n
123 // C# 1.0及更高版本可用\u0026#xD;\n\u0026#xD;\n1_2_3 // C# 7.0及更高版本可用\u0026#xD;\n0x1_2_3 // C# 7.0及更高版本可用\u0026#xD;\n0b101 // C# 7.0新增的二进制字面量\u0026#xD;\n0b1_0_1 // C# 7.0及更高版本可用\u0026#xD;\n\u0026#xD;\n// 在C# 7.2中,_可以用在`0x`或`0b`之后\u0026#xD;\n0x_1_2 // C# 7.2及更高版本可用\u0026#xD;\n0b_1_0_1 // C# 7.2及更高版本可用\u0026#xD;\n
\u0026#xD;\n\u0026#xD;\n

C# 7.2:非尾部命名参数

\u0026#xD;\n\u0026#xD;\n

C#中的命名参数服务于两种目的:

\u0026#xD;\n\u0026#xD;\n
  • 允许跳过可选参数; \u0026#xD;\n\u0026#xD;\n
  • 明确访问接口,尤其是Boolean参数。\u0026#xD;\n

该特性处理第二种情况。例如:

\u0026#xD;\n\u0026#xD;\n
void DoSomething(bool delayExecution, bool continueOnError, int maxRecords);\u0026#xD;\nDoSomething(true, false, 100);\u0026#xD;\n
\u0026#xD;\n\u0026#xD;\n

除非开发人员记住了函数签名,否则很难一眼就看出了truefalse对应什么。过去,开发人员可以写成下面这样:

\u0026#xD;\n\u0026#xD;\n
DoSomething(delayExecution: true, continueOnError: false, maxRecords: 100);\u0026#xD;\n
\u0026#xD;\n\u0026#xD;\n

但是,如果对maxRecords参数没有疑问却还需要指定似乎就有点奇怪。在非尾部命名参数提案中,开发人员可以根据需要指定参数。

\u0026#xD;\n\u0026#xD;\n
DoSomething(delayExecution: true, continueOnError: false, 100);\u0026#xD;\n
\u0026#xD;\n\u0026#xD;\n

编者注:当清晰度成为问题时,Enum仍然好于Boolean

\u0026#xD;\n\u0026#xD;\n

C# 7.2:Private Protected

\u0026#xD;\n\u0026#xD;\n

C#有5个访问级别:privateinternalprotectedprotectedinternalpublic。但是,CLR还有第六个访问级别,名为FamANDAssem,“允许程序集中的子类型访问”。

\u0026#xD;\n\u0026#xD;\n

冷知识:在CLR中,protected称为family,而internal称为assembly

\u0026#xD;\n\u0026#xD;\n

借助新关键字“private protected”,开发人员可以使用CLR的FamANDAssem标识了。Private Protected提案说明了这样做的重要性:

\u0026#xD;\n\u0026#xD;\n
\u0026#xD;\n

在许多情况下,API都会包含一些成员函数,只打算让提供该类型的程序集中的子类实现并使用。CLR提供了用于此目的的访问级别,但C#中没有。因此,别无选择,API所有者要么诉诸于internal保护、自律或自定义分析器,要么使用protected,并提供额外的文档说明,虽然该类型的公开文档中有这个成员函数,但它并不是公有API的一部分。至于后者的例子,可以看下Roslyn CSharpCompilationOptions中以Common开头的成员。

\u0026#xD;\n
\u0026#xD;\n\u0026#xD;\n

C# 7.2:只读引用

\u0026#xD;\n\u0026#xD;\n

我们之前报道过只读引用,所以这里没什么新东西要介绍。本质上讲,只读引用只是为了说明开发人员希望通过引用传递结构从而获得性能收益,而不是真正改变值的能力。

\u0026#xD;\n\u0026#xD;\n

目前,只读引用提案尚处于原型阶段,还没有实现。

\u0026#xD;\n\u0026#xD;\n

ref-like类型编译时安全强化[7.2提案]

\u0026#xD;\n\u0026#xD;\n

该C#特性又称为“内部指针”或“ref-like类型”。该提案旨在让编译器可以要求特定的类型(Span\u0026lt;T\u0026gt;)仅出现在栈上。该特性仅对高性能场景而言比较重要。从我们上次报道以来,ref-like类型提案没有任何变化。

\u0026#xD;\n\u0026#xD;\n

放弃的特性

\u0026#xD;\n\u0026#xD;\n

以下特性没有被标记为7.2提案的一部分。虽然这不是说一定不会标记,但可能不会很快发生。

\u0026#xD;\n\u0026#xD;\n
  • Blittable类型\u0026#xD;\n\u0026#xD;\n
  • Ref本地重新赋值\u0026#xD;\n

查看英文原文: Catching up with C# 7.1 and C# 7.2

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/242695.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用Systemverilog描述状态机

使用Systemverilog描述状态机 系统的状态必须保存在内部寄存器中。在SystemVerilog语言中,状态可以用枚举类型(enumerated type)表示。这种类型的可能值是状态名,而变量名列在一系列可能值的后面。例如: enum{s0,s1,..} state;在下面的代码中,有两个过程块。每个过程块都…

菜鸟做设计必看!有关如何做设计的整体思路,以及能否综合的笔记

对Verilog 初学者比较有用的整理(转自它处) 作者: Ian11122840 时间: 2010-9-27 09:04 标题: 菜鸟做设计必看!有关如何做设计的整体思路,以及能否综合的笔记 所谓综合,就是把描述语言转化成能硬件实现的电路,学verilog的时候&…

呆账是什么东西?快到手的贷款竟然泡汤了

雷小锋有个朋友,工作收入各方面都不错,信用也良好,抱着很大的希望去申请贷款,结果悲剧了,原因是他有呆账。说到呆账,很多人都可能一脸懵逼,但是呆账是极度恐怖的,业内有一次呆账等于…

时序构成的测试平台

时序构成的测试平台 时钟信号的产生 在任何类型的设计中,最重要的信号是时钟信号。把信号电平按照规定的时间间隔反相,就可以产生时钟信号,这是最简单时钟信号发生器。 任何信号的默认值为“x”。若只是把某个信号按照规定的时间间隔反相,将把“x”值反相。下面的代码不能…

熬夜所带来的伤害,远比我们想象的更可怕

-1-最近连着下雨,猫在家里,刷刷剧,打扫打扫卫生,感觉很是享受。晚上躺床上,迟迟不肯睡觉,直到手机提醒已经过了12点才恋恋不舍地放下手机。前段时间好不容易养成的早睡习惯又被打破了。发了条朋友圈吐槽&am…

认识FPGA触发器的亚稳态

边沿型触发器的输出有两个稳定状态: 高电平或者低电平。为保证可靠操作, 必须要满足触发器的时序要求,也就是我们熟知的建立时间和保持时间。如果输入信号违反了触发器的时序要求, 那么触发器的输出信号就有可能会出现非法状态—亚稳态。亚稳态是一种不稳定状态,在一…

一觉醒来,借呗竟然被封了

近日有一个网友向马云喊冤,自己经常用借呗,而且都是按时还款,给马云创造了不少的利润,可是前几天他一觉醒来,发现自己的借呗不能借了,只能还钱,不能借钱,这个朋友就很纳闷&#xff0…

面向对象的编程

面向对象的编程 面向对象编程(OOP)原本属于软件开发方法学范畴,似乎与SystemVerilog这一类硬件描述语言没有任何关系。在传统的编程语言,例如C和FORTRAN中,程序根据数据结构进行操作。在 SystemVerilog语言的过程块(例如initial和always块)中,程序的运行与传统的编程语言十…

主时钟选择基本要点

以信道化体制举例,2000MHZ采样,且数据交叠50%,基本多相滤波思路,如40MHZ子信道宽度,抽取率50。由于50%交叠,等价于25抽取率,每个信道数据率40Mhz*2=80MHZ。则若主时钟采用整数倍&…

开源指令集RISC-V

作者:知乎用户 链接:https://www.zhihu.com/question/28368960/answer/63275513 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 现在已经有不少关于RISC-V的项目了玛德拉斯印度理工学院(II…

基于断言的验证

基于断言的验证 断言的概念十分简单。只要在程序中声明,我们相作言某事情必定为真,若不为真,则在屏幕上打印错误信息即可。在 SystemVerilog语言中,断言可以用立即(immediate)和并发(concurrent)两种不同形式的断言来表示。立即断言十分简洁,可以用if、else等语句表示。而…

贷款被拒,因为你的手机有问题

最近有个朋友去贷款,到了贷款公司,本来聊得挺好的,后来风控说要看下他手机,结果看完之后,风控说回去等结果,然后就没有任何消息了。为何风控看了一眼手机,然后贷款就被拒了呢?因为你…

世界各地奇葩讨债方法,竟百发百中

俗话说有借有还,再借不难,但是实际上有很多人天生就是老懒的性格,借钱的时候很客气,说的比唱的还好听,到了该还钱的时候突然变了一个人,任你怎么软磨硬泡他就是无动于衷。借债不还在世界各地都有发生&#…

PID笔记

PID笔记 在t时刻: 输入量为rin(t)输出量为rout(t)偏差量为err(t)=rin(t)-rout(t)PID的控制规律为: 假设是规定为直流电机调速的。 输入量rin(t)为电机转速预定值(转/min)。 输出量rout(t)为电机转速实际值(转/min)。 偏差量为预定值和实际值之差(转/min)。 执行器为直…

奇异递归模板模式(Curiously Recurring Template Pattern,CRTP)

The Curiously Recurring Template Pattern (CRTP) is a C idiom whose name was coined by James Coplien in 1995, in early C template code. The “C” in CRTP made it travel the years in the C community by being this: a Curiosity. We often find definitions of w…

因为征信原因,买房的2万定金没了

近日有一位网友在网上发帖寻求帮助,他自己买了套房,已经向开发商交了2万元定金,但是等他去办理贷款的时候,银行却说他不符合贷款条件,所以按揭贷款没有批下来,最后他要求开发商退还那2万的定金,…

愿你白天有说有笑,晚上睡个好觉

插画:annie.Z-1-手机设置了静音,早晨起来,被十几条未接电话惊醒,准备回拨过去,看到姑姑发来的短信:祝你生日快乐。看了看日历才反应过来,今天是自己的农历生日。打开微信,一朋友发来…

C指针的理解

C指针的理解 指针 (编程语言中的一个对象):指针也就是内存地址,指针变量是用来存放内存地址的变量,在同一CPU构架下,不同类型的指针变量所占用的存储单元长度是相同的,而存放数据的变量因数据的类型不同&a…

你以为有白金卡就很牛逼?错!

近段有个朋友办了一张平安银行的白金卡,额度5万元,然后他高兴得不得了,还到处炫耀,以为带个“白金”字就很牛逼,其实不然,表面上看,白金卡虽然高大上,其实也只是一种卡级而已。所以今…

解决Win10下_findnext()异常

在win10中,使用文件遍历函数_findnext会报0xC0000005错误 原因: _findnext()第一个参数”路径句柄”,返回的类型为intptr_t(long long),如果定义为long,在win7中是没有问题,但是在…