C#8.0 新增功能
Posted savionzhang
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C#8.0 新增功能相关的知识,希望对你有一定的参考价值。
C#8.0提供了许多增强功能
readonly
修饰符应用于结构的任何成员。 它指示该成员不会修改状态。 这比将 readonly
修饰符应用于 struct
声明更精细。 请考虑以下可变结构:public struct Point public double X get; set; public double Y get; set; public double Distance => Math.Sqrt(X * X + Y * Y); public override string ToString() => $"(X, Y) is Distance from the origin";
像大多数结构一样, ToString()
方法不会修改状态。 可以通过将 readonly
修饰符添加到 ToString()
的声明来对此进行指示:
public readonly override string ToString() => $"(X, Y) is Distance from the origin";
上述更改会生成编译器警告,因为 ToString
访问 Distance
属性,该属性未标记为 readonly
:
warning CS8656: Call to non-readonly member ‘Point.Distance.get‘ from a ‘readonly‘ member results in an implicit copy of ‘this‘
需要创建防御性副本时,编译器会发出警告。 Distance
属性不会更改状态,因此可以通过将 readonly
修饰符添加到声明来修复此警告:
public readonly double Distance => Math.Sqrt(X * X + Y * Y);
请注意,readonly
修饰符对于只读属性是必需的。 编译器不会假设 get
访问器不修改状态;必须明确声明 readonly
。 编译器会强制实施以下规则:readonly
成员不修改状态。除非删除 readonly
修饰符,否则不会编译以下方法:
public readonly void Translate(int xOffset, int yOffset) X += xOffset; Y += yOffset;
通过此功能,可以指定设计意图,使编译器可以强制执行该意图,并基于该意图进行优化。
现在可以将成员添加到接口,并为这些成员提供实现。 借助此语言功能,API 作者可以将方法添加到以后版本的接口中,而不会破坏与该接口当前实现的源或二进制文件兼容性。 现有的实现继承默认实现 。 此功能使 C# 与面向 android 或 Swift 的 API 进行互操作,此类 API 支持类似功能。 默认接口成员还支持类似于“特征”语言功能的方案。
默认接口成员会影响很多方案和语言元素。 请参考使用默认实现更新接口。
以上是关于C#8.0 新增功能的主要内容,如果未能解决你的问题,请参考以下文章
Espressif-IDE v2.8.0 新增功能及开发方向
MySQL 8.0 新增复制功能;TensorFlow 1.1.0 添加部分语言的安装指南 | 软件周刊