GMTC 全球大前端技术大会(北京站)门票 9 折特惠中,点击立减 ¥480 了解详情
写点什么

C# 8 新增小功能

2019 年 6 月 24 日

C# 8 新增小功能

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


目标类型表达式

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


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


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


A a1 = (A)b ?? (A)c;A a2 = x>0 ? (A)b : (A)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 也可以被标记为只读。比如,当属性值存于字典中而不是直接存入结构本身的时候。


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


  • 这么做,没有与性能相关的优势

  • 只读关键字不意味着状态不会改变,只是不会直接修改对象上的字段。

  • 这是只读结构的扩展,没有等效的只读类。


查看英文原文:C# 8 More Small Features


2019 年 6 月 24 日 08:0011576
用户头像

发布了 199 篇内容, 共 67.0 次阅读, 收获喜欢 275 次。

关注

评论

发布
暂无评论
发现更多内容

通用中间件模型

型火🔥

架构 分布式 抽象 中间件 模型

jdk 源码系列之 TheadPoolExecutor

sinsy

jdk ThreadPoolExecutor

大作业-附件5

曾烧麦

产品训练营

架构师训练营 4 期 第11周

引花眠

架构师训练营 4 期

卡梅隆和他的《阿凡达》「Day 22」

道伟

28天写作

最新版Swagger 3升级指南和新功能体验!

王磊

Java swagger

大作业

瑾瑾呀

大作业-附件3

曾烧麦

产品训练营

Google面试题-怎样实现拼写纠错的功能?

Nick

数据结构 二分查找 数据结构与算法

如何打造一款全球化的App?

故胤道长

硅谷 国际化 ios开发 Android开发 硅谷问道

前端开发:项目运行npm install 提示XXX packages are looking for funding run `npm fund` for details的解决方法

三掌柜

vue.js 前端 3月日更

高并发HTTP请求实践

namelij

分布式事务

insight

分布式事务 3月日更

大作业-附件1

曾烧麦

产品训练营

大作业-附件2

曾烧麦

产品训练营

大作业-附件4

曾烧麦

产品训练营

寻找被遗忘的勇气(十四)

Changing Lin

3月日更

JDK动态代理的实现机制

xzy

Java 动态代理 原理分析

哈希吧,滚雪球学 Python 哈希表与可哈希对象

梦想橡皮擦

28天写作 3月日更

架构师训练营-Web 攻击与防护

引花眠

架构师训练营 4 期

容器引擎学习笔记

lenka

3月日更

让我们"从头开始重新设计系统"吧

御剑

架构 程序员人生

面试官再问你优先级队列,请把这篇文章丢给他

Silently9527

Java 优先级队列 二叉堆

52条SQL语句性能优化策略,建议收藏

Java小咖秀

MySQL 性能优化 后端 MySQL性能优化

写代码这件事

ES_her0

28天写作 3月日更

【LeetCode】设计哈希映射Java题解

HQ数字卡

算法 LeetCode 28天写作 3月日更

源码分析-Netty: 并发编程的实践(二)

程序员架构进阶

源码分析 Netty 多线程高并发 28天写作 3月日更

Docker 教程(二):Dockerfile

看山

Docker Dockerfile

优雅编程 | 24个Javascript代码优化技巧

devpoint

js 空值运算符 高级函数 模板字面量

javascript中的Strict模式

程序那些事

JavaScript ES6 程序那些事

利用深度元学习对城市销量进行预测 | AAAI 2021论文解读

京东科技开发者

零售 预测

DIY 的 Kubernetes 集群的稳定性保障实践

DIY 的 Kubernetes 集群的稳定性保障实践

C# 8 新增小功能-InfoQ