内容简介:尽管 C# 8 应该会在今年发布,并且 C# 8.x 和 9 的路线图也开始形成,但是,微软正在继续审查下一个版本的特性。假设我们有 A、B 和 C 三种类型,其中类型 B 和 C 是类型 A 的子类型。如果我们使用如下所示的语句,那么,编译器无法确定右侧要返回的类型。
尽管 C# 8 应该会在今年发布,并且 C# 8.x 和 9 的路线图也开始形成,但是,微软正在继续审查下一个版本的特性。
目标类型表达式
假设我们有 A、B 和 C 三种类型,其中类型 B 和 C 是类型 A 的子类型。如果我们使用如下所示的语句,那么,编译器无法确定右侧要返回的类型。
复制代码
Aa1=b?? c; Aa2= x>0?b: c; Aa3= aswitch{ Bb=>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
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- dotCover 2019.3 新增功能
- GCC 8.1 发布,新增大量功能
- oscnews 1.4.0 更新,新增多个功能
- 码良之笔更新,新增组件商城功能
- ExcelUtil 3.1.0 发布,新增模板导出功能
- ExcelUtil 3.1.2 发布,新增水印导出功能
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
HTML 编码/解码
HTML 编码/解码
MD5 加密
MD5 加密工具