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
会拥有名为A
和B
的属性。
\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
除非开发人员记住了函数签名,否则很难一眼就看出了true
和false
对应什么。过去,开发人员可以写成下面这样:
\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个访问级别:private
、internal
、protected
、protected
或internal
、public
。但是,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的一部分。至于后者的例子,可以看下RoslynCSharpCompilationOptions
中以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
C# 7.1、7.2特性追踪相关推荐
- 区块链笔记:典型应用:数据资产、交易系统、即时通信、链上游戏、追踪溯源等
数据资产 1 ) 详解 这是区块链的一个比较核心的应用,对于软件系统或者说对于互联网系统来讲,对数据的处理.分析.计算,这些功能是属于比较基本的软件功能 对于区块链来讲它的核心的功能是在于创新式的提供 ...
- 使用ILSpy探索C#7.0新增功能点
第一部分: C#是一种通用的,类型安全的,面向对象的编程语言.有如下特点: (1)面向对象:c# 是面向对象的范例的一个丰富实现, 它包括封装.继承和多态性.C#面向对象的行为包括: 统一的类型系统 ...
- Golang的CSP很酷?其实.NET也可以轻松完成
CSP(Communicating sequential processes) 这东西我一开始以为很简单,后面差了资料发现它独树一帜,自己是一门语言,也是一套理论.这边我不深入的对它做过多的见解,我怕 ...
- HTML5标准有缺陷 手机电池信息可泄露上网活动
智能手机电池信息 北京时间8月3日消息,据科技网站DigitalTrends报道,由于HTML5标准的兴起,手机电池可能向网站泄露用户的上网活动.相关功能最初的目的,是在手机电量低时使网站能向用户提供 ...
- 共享单车智能管控技术手段探讨
随着云计算.互联网.大数据技术的快速发展,共享经济逐步变成了科技革命和产业链转型背景下的新兴模式. 共享单车作为共享经济的一种创新模式,获得了飞速的发展和运用,共享单车在满足了短途出行的同时,也出现了 ...
- layui表格中开启复选框后,怎么获取跨页勾选的全部数据,layui表格获取勾选的所有数据,获取跨页勾选数据的数量,如何预渲染让数据默认勾选上?
这个功能layui 本身可能没直接提供给我们相关的功能 ,需要自己写出来了 有几个疑点 可能要一一排查出来 核心点: 能不能有一个状态值 能判断当前行的数据 是否是勾选状态 然后就可以 一步一步 ...
- android 通知历史,Android P新特性:追踪应用通知历史
原标题:Android P新特性:追踪应用通知历史 IT之家3月9日消息 不久前,谷歌已经正式推出了首个Android P开发者预览版,包含了许多新特性.对此,IT之家也进行了一系列报道.该系统的新特 ...
- Spring Cloud Alibaba 高级特性 应用性能监控:通过 SkyWalking 实施链路追踪
上一讲我们掌握了基于 Sleuth+Zipkin 对微服务架构实施基于日志的链路追踪,通过 Sleuth 在微服务应用中附加链路数据,再通过 Zipkin 实现链路数据收集与可视化,从而保证开发与运维 ...
- mysql space id_MySQL8.0新特性:增加系统文件追踪space ID和物理文件的映射-阿里云开发者社区...
update:从8.0.11开始,又改成了打开全部ibd文件,但是改成了并行扫描 Note1: 本文所有代码相关的内容都是基于MySQL8.0.3,而目前版本还处于RC和快速开发的状态,不排除后面的版 ...
最新文章
- Oracle修改字段类型方法
- 基于 axios 的 Vue 项目 http 请求优化
- 计算机专业好还是铁道运输管理好,铁道运输管理专业主要是干什么的?
- Hosts 文件作用及如何修改
- SQL Server2008官方下载地址
- 使用模块优化工资计算器
- 欧几里德与扩展欧几里德算法
- 计算机串口故障,电脑故障:主板串口接口故障的维修方法总结
- 安卓前端和python后端_在移动应用程序中结合html前端和python“后端”
- jquery gotop插件
- AI语音机器人有哪些需要注意事项
- 《计算机系统与网络安全技术》一页纸开卷/期末复习内容
- 松下P2卡MXF视频恢复方法
- 临床血液学综合练习题库【1】
- Flink_企业级风控平台架构建设_01
- 倍福Twincat NC PTP使用介绍
- C语言:字符串和字符串函数
- 小功能⭐️Unity中利用材质自发光实现物体闪烁效果
- 文件夹内图片消失不见了怎么办?文件夹内图片消失怎样找回来
- php自我介绍50字,自我介绍作文50字
热门文章
- 【转】Dubbo_与Zookeeper、SpringMVC整合和使用(负载均衡、容错)
- HttpURLConnection和HttpClient的简单用法
- object-c 运行时显示view没有设置outlet的错误
- python用代码安装3.6_Python3.6安装及引入Requests库的实现方法
- 磁盘的块大小(Block Size)和扇区大小(Sector Size)
- ir2104s的自举电容_电赛必备,IR2104S半桥驱动MOS管电机驱动板(PCB工程文件+磁悬浮代码)...
- mysql key uni_uni app 踩坑实录
- python编程内置函数使用方法_Python内置函数 next的具体使用方法
- Python重现创业板指数行情
- 计算机配置 凭据分配,win7怎样添加凭据?-win7添加凭证的方法 - 河东软件园