专栏首页DotNet程序园C# 8 新增小功能

C# 8 新增小功能

尽管 C# 8 应该会在今年发布,并且 C# 8.x 和 9 的路线图也开始形成,但是,微软正在继续审查下一个版本的特性。

目标类型表达式

假设我们有 A、B 和 C 三种类型,其中类型 B 和 C 是类型 A 的子类型。如果我们使用如下所示的语句,那么,编译器无法确定右侧要返回的类型。

A a1 = b ?? cA a2 = x>0 ? b : cA a3 = 	a switch {B b => b,C c => c,_ => throw new System.Exception()}

通常情况下,修复该问题需要添加强制转换,如:

A a1 = b ?? c;A a2 = x>0 ? b : c;

根据目标类型switch表达式提议,在每种情况下都允许编译器使用语句(A a1)的左侧来决定右侧(b ??c)应该返回的类型。该功能还可以用于返回语句(return b ??c),但不能用于变量(var a1 = b ??c)。

目前,这个(例 3)的模式匹配版本计划于 C# 8.0 中提供,其他两个则于 8.x 中提供。

允许在解构中使用“default”

根据该提议,这个小功能将允许在初始化元组时使用 default 关键字:

(int i, string s) = default;(i, s) = default;

过时的属性

与 Visual Basic 不同,C# 无法把单个 getter 和 setter 标记为过时。相反,只能将属性作为整体做这样的标记。该提议纠正了这种情况。为了理解这个问题的重要性,请看看 Cory Nelson 的评论。

就在几个星期前,我试图清理一些大量使用 get/set 属性的代码,使其成为一个更加只读的初始化的构造函数(ctor-initialized),此时我发现我真希望该特性是这样的。

4 月,该特性从 C# 9 迁移到了 C# 8 上。

结构上的只读成员

当分配给只读字段或用作 in 参数时,结构上的方法有个性能小问题。如果我们调用结构上的方法,编译器首先会生成防御性副本。尽管这通常不足以产生问题,但是,在用于紧密循环(tight loop)时,细微的低效的确会累积出性能问题。

对于完全不可变的结构,可以标记整个结构为只读,这样可以避免此类情况的发生。然而,出于性能的缘故,很多结构是可变的。

根据只读示例方法提议,开发人员将能够把单个方法标记为只读。这向编译器表明,防御性副本不是必要的,没有值会被修改。

这和Pure 属性不同,只要只读方法不修改结构本身的值,那么就有明显的副作用。

自动实现属性的 getter 将被自动认为是只读的。在某些情况下,setter 也可以被标记为只读。比如,当属性值存于字典中而不是直接存入结构本身的时候。

在目前的提议下,引用类型(类和接口)将不会受到该特性的支持。原因有三重:

  • 这么做,没有与性能相关的优势
  • 只读关键字不意味着状态不会改变,只是不会直接修改对象上的字段。
  • 这是只读结构的扩展,没有等效的只读类。

原文地址:https://www.infoq.cn/article/H9a_LecLcPwkQoWyTYNf

本文分享自微信公众号 - DotNet程序园(dotnetblog),作者:Jonathan Allen

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-07-02

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • .NETCore - AgileHttp

    2020年新年将至,先预祝.Net Core越来越好。 做了这么多年一线开发,经常跟Http打交道。比如调用三方的Webservice,比如集成微信支付的时候服...

    梁规晓
  • 超简单让.NET Core开发者快速拥有CI/CD的能力-Docker版本

    上一篇自动化测试,全面且详细的介绍了从零开始到发布版本的步骤,这是传统的方式,本次为大家带来的是如何在5分钟内使用上docker进行CI/CD,毕竟现在的容器化...

    梁规晓
  • 【5min+】 巨大的争议?C# 8 中的接口

    【五分钟的dotnet】是一个利用您的碎片化时间来学习和丰富.net知识的博文系列。它所包含了.net体系中可能会涉及到的方方面面,比如C#的小细节,Aspne...

    梁规晓
  • 【补充】任意密码重置姿势

    跟第三个有点类似,只判断了接收端和验证码是否一致,未判断接收端是否和用户匹配,因此修改接收端可达到重置目的

    用户1467662
  • 聊聊SkyWalkingAgent

    skywalking-6.6.0/apm-sniffer/apm-agent/src/main/java/org/apache/skywalking/apm/a...

    codecraft
  • c++临时变量

    C++临时变量 “有时候,在求表达式的期间,编译器必须创建临时变量(temporary object)。像其它任何对象一样,它们需要存储空间,并且必须能够构造和...

    ke1th
  • 聊聊SkyWalkingAgent

    skywalking-6.6.0/apm-sniffer/apm-agent/src/main/java/org/apache/skywalking/apm/a...

    codecraft
  • SAP最佳业务实践:MM–管道资源物料的采购(903)-2业务处理

    3 流程概览表 步骤名称业务条件角色事务­代码预期结果过帐管道资源物料的发货发货已在系统中创建仓库管理员MIGO_GI根据计划协议过帐收货从管道资源提取收到发票...

    SAP最佳业务实践
  • SAP MMAM物料类型修改

    如果物料的material type在建立时选择错误,在一定条件下SAP是允许可以修改的,如果这个物料满足以下条件,就可以修改物料的material type:

    用户5495712
  • 一图看懂 NVIDIA 与智慧城市

    出自瘾科技 智慧城市是目前相当热门的科技新议题,而在智慧城市的背后也隐含另一个火热话题人工智慧的应用,当人工智慧的当红炸子鸡 NVIDIA 遇到智慧城市会...

    机器人网

扫码关注云+社区

领取腾讯云代金券

玩转腾讯云 有奖征文活动