【ArchSummit架构师峰会】精华内容上线75%,AI大模型中台从理念到实践的探索!>>> 了解详情
写点什么

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:0015381
用户头像

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

关注

评论

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

1业务架构作业

梁山伯

《中国指标中台市场研究报告》线上发布会

Kyligence

数据分析 指标中台

用 nodejs 搭建脚手架

coder2028

node.js

Vue3知识点之数据侦测

yyds2026

Vue

阿里p8私藏MyBatis笔记,从入门到精通,纵享源码细节

钟奕礼

Java 程序员 java面试 java编程

手写vue-router核心原理

hellocoder2029

JavaScript

Vue3必会技巧-自定义Hooks

yyds2026

Vue

5年经验年薪百万,一位阿里P8分享自己的成长干货

钟奕礼

Java java面试 java编程 程序员、

2023年北京企业办理备案流程详解

行云管家

等保 等保备案 北京

Jvm上如何运行其他语言?JSR223规范最详细讲解

架构师之道

Java JVM

我服了!腾讯专家手敲《Redis源码日志笔记》,字字如金

钟奕礼

Java 程序员 java面试 java编程

React组件复用的发展史

夏天的味道123

React

Vue中的diff算法深度解析

yyds2026

Vue

2022年11月国产数据库大事记-墨天轮

墨天轮

数据库 tdsql 国产数据库 达梦 polarDB

龙蜥大讲堂12月预告来了!来自统信软件、移动云和浪潮信息等多位技术专家在线分享

OpenAnolis小助手

ebpf 移动云 龙蜥大讲堂 直播预告 统信软件

Java程序员开发3年如何能拿到年薪40W?(强烈推荐涨薪必备)

钟奕礼

Java 程序员 java面试 java编程

模块一

GeekMLS

构架

上帝视角一览大数据开发体系

JAVA旭阳

Java 大数据

理解Nodejs中的进程间通信

coder2028

node.js

理解NodeJS多进程

coder2028

node.js

细说JavaScript闭包

hellocoder2029

JavaScript

阿里技术官珍藏JVM全优笔记,细节满分,吃透写精通没问题

钟奕礼

Java 程序员 java面试 java编程

Webpack插件核心原理

Geek_02d948

webpack

Webpack完整打包流程分析

Geek_02d948

webpack

不知如何优选达人?火山引擎VeDI零售行业解决方案一键解决!

字节跳动数据平台

大数据 数据分析 营销 12 月 PK 榜

ha集群是什么意思?一般有几个节点?

行云管家

高可用 ha ha集群

Webpack中的高级特性

Geek_02d948

webpack

彻底搞懂JS原型与原型链

hellocoder2029

JavaScript

中小企业都在用哪些项目进度跟踪系统?

PingCode

软件项目管理工具 PingCode 入选2022年度企服口碑产品TOP36——36氪

PingCode

还在写代码处理映射关系? 动动手指,MatrixDB 4.4 轻松让 JSON 入表!

YMatrix 超融合数据库

kafka 产品发布 超融合数据库 YMatrix MatrixGate

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