连载目录 【已更新最新开发文章,点击查看详细】
C#8.0提供了许多增强功能
01 Readonly 成员
可将 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; }
通过此功能,可以指定设计意图,使编译器可以强制执行该意图,并基于该意图进行优化。
02 默认接口成员
现在可以将成员添加到接口,并为这些成员提供实现。 借助此语言功能,API 作者可以将方法添加到以后版本的接口中,而不会破坏与该接口当前实现的源或二进制文件兼容性。 现有的实现继承默认实现 。 此功能使 C# 与面向 Android 或 Swift 的 API 进行互操作,此类 API 支持类似功能。 默认接口成员还支持类似于“特征”语言功能的方案。
默认接口成员会影响很多方案和语言元素。 请参考使用默认实现更新接口。
03 在更多位置中使用更多模式
04 using 声明
05 静态本地函数
06 可处置的 ref 结构
07 可为空引用类型
08 异步流
09 索引和范围
连载目录 【已更新最新开发文章,点击查看详细】
原文地址:https://www.cnblogs.com/SavionZhang/p/11201818.html