写点什么

C# 8 新增小功能

  • 2019-06-24
  • 本文字数:1075 字

    阅读完需:约 4 分钟

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-06-24 08:0015459
用户头像

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

关注

评论

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

MindNode 5 for Mac(思维导图) v5.0.1中文激活版

mac

思维导图软件 苹果mac Windows软件 MindNode 5

软件测试/人工智能|一文告诉你LangChain核心模块chains原理

霍格沃兹测试开发学社

速速报名!请查收 2023 龙蜥操作系统大会超全指南

OpenAnolis小助手

开源 龙蜥社区 北京 2023龙蜥操作系统大会

全力备战中国大学生计算机设计大赛!历年获奖作品正式上线和鲸社区

ModelWhale

Python 云计算 算法 数据分析 中国大学生计算机设计大赛

PingCAP 被评为 Translytical Data Platforms 2023 全球技术领导者

PingCAP

数据库 TiDB

Footprint 的批量下载方案使交易回测更轻松

Footprint Analytics

区块链 回测

DAPP合约区块链技术项目系统开发

l8l259l3365

WiFi7 IPQ9574-IPQ9554-QCN9274-QCN6274-space-time Block Code technology

wifi6-yiyi

ipq9574

用行云管家实现IT统一运维管理,提高运维效率

行云管家

IT运维 行云管家 运维管理 统一运维

Royal TSX for Mac(远程管理软件)6.0.2激活版

Geek_幻墨成诗

Royal TSX MacOS远程管理

Rhinoceros 8 for Mac(犀牛8 mac版)激活版

Geek_幻墨成诗

Rhinoceros 7 Rhinoceros8

Java 实现 MySQL 数据锁定策略

秃头小帅oi

如何使用1688店铺所有商品API接口

Noah

都2023年了,你还不会 CI/CD 吗?

伤感汤姆布利柏

ci CD

iZotope RX 10 for mac v10.4.2 激活版

Geek_幻墨成诗

iZotope RX 10下载 iZotope RX 10破解版 iZotope RX 10 mac iZotope RX 10

你知道Spring中BeanFactoryPostProcessors是如何执行的吗?

EquatorCoco

spring 后端 springboot

上海统一运维管理平台推荐-行云管家

行云管家

IT运维 运维管理 统一运维

Android 实现APP可切换多语言

EquatorCoco

APP开发 Andriod开发

Redis Desktop Manager for Mac(Redis桌面管理工具)中文激活版

Geek_幻墨成诗

RESP

re:Invent 2023:PingCAP 荣获亚马逊云科技 2023 年度合作伙伴奖项

PingCAP

数据库 AWS TiDB 亚马逊云科技 pingCAP

JavaScript中的异步处理方法,

互联网工科生

JavaScript 异步处理

生成式AI与预测式AI的主要区别与实际应用

高端章鱼哥

生成式AI 预测式AI

uniapp开发App从开发到上架全过程

雪奈椰子

3D场景建模工具

3D建模设计

在线工具 3D场景建模 数字孪生场景

Last Week in Milvus

Zilliz

非结构化数据 Milvus Zilliz AIGC 向量数据库

软件测试/人工智能|为什么Python在人工智能时代异军突起

霍格沃兹测试开发学社

异常追踪与 JIRA 实现双向联动最佳实践

心有千千结

可观测性 Jira

软件测试/人工智能|LangChain核心模块Agents详解

霍格沃兹测试开发学社

BetterMouse for Mac中文激活版下载(鼠标增强软件)

iMac小白

次世代建模纹理贴图怎么做?

3D建模设计

3D渲染 材质贴图 模型纹理

「智造」第10期:浅谈工业互联网加速企业服务化转型

用友BIP

智能制造

C# 8 新增小功能_语言 & 开发_Jonathan Allen_InfoQ精选文章