Lambda 的调用方式与方法和本地函数不同 , 因此在调用 lambda 时属性没有任何影响 。 但是 , lambdas 上的属性对于代码分析仍然有用 , 并且可以通过反射发现它们 。
structs 的改进
C# 10 为 structs 引入了功能 , 可在 structs (结构) 和类之间提供更好的奇偶性 。 这些新功能包括无参数构造函数、字段初始值设定项、记录结构和 with 表达式 。
01 无参数结构构造函数和字段初始值设定项
在 C# 10 之前 , 每个结构都有一个隐式的公共无参数构造函数 , 该构造函数将结构的字段设置为默认值 。 在结构上创建无参数构造函数是错误的 。
从 C# 10 开始 , 你可以包含自己的无参数结构构造函数 。 如果你不提供 , 则将提供隐式无参数构造函数以将所有字段设置为默认值 。 你在结构中创建的无参数构造函数必须是公共的并且不能是部分的:
public struct Address { public Address { City = ""; } public string City { get; init; } }
你可以如上所述在无参数构造函数中初始化字段 , 也可以通过字段或属性初始化程序初始化它们:
public struct Address { public string City { get; init; } = ""; }
通过默认创建或作为数组分配的一部分创建的结构会忽略显式无参数构造函数 , 并始终将结构成员设置为其默认值 。 有关结构中无参数构造函数的更多信息 , 请参阅结构类型 。
02 Record structs
从 C# 10 开始 , 现在可以使用 record struct 定义 record 。 这些类似于 C# 9 中引入的 record 类:
public record struct Person { public string FirstName { get; init; } public string LastName { get; init; } }
你可以继续使用 record 定义记录类 , 也可以使用 record 类来清楚地说明 。
结构已经具有值相等 —— 当你比较它们时 , 它是按值 。 记录结构添加 IEquatable 支持和 == 运算符 。 记录结构提供 IEquatable 的自定义实现以避免反射的性能问题 , 并且它们包括记录功能 , 如 ToString 覆盖 。
记录结构可以是位置的 , 主构造函数隐式声明公共成员:
public record struct Person(string FirstName, string LastName);
主构造函数的参数成为记录结构的公共自动实现属性 。 与 record 类不同 , 隐式创建的属性是读 / 写的 。 这使得将元组转换为命名类型变得更加容易 。 将返回类型从 (string FirstName, string LastName) 之类的元组更改为 Person 的命名类型可以清理你的代码并保证成员名称一致 。 声明位置记录结构很容易并保持可变语义 。
如果你声明一个与主要构造函数参数同名的属性或字段 , 则不会合成任何自动属性并使用你的 。
要创建不可变的记录结构 , 请将 readonly 添加到结构(就像你可以添加到任何结构一样)或将 readonly 应用于单个属性 。 对象初始化器是可以设置只读属性的构造阶段的一部分 。 这只是使用不可变记录结构的一种方法:
var person = new Person { FirstName = "Mads", LastName = "Torgersen"}; public readonly record struct Person { public string FirstName { get; init; } public string LastName { get; init; } }
在本文中了解有关记录结构的更多信息 。
记录结构
https://docs.microsoft.com/dotnet/csharp/language-reference/builtin-types/record
03 Record 类中 ToString 上的密封修饰符
记录类也得到了改进 。 从 C# 10 开始 , ToString 方法可以包含 seal 修饰符 , 这会阻止编译器为任何派生记录合成 ToString 实现 。
在本文中的记录中了解有关 ToString 的更多信息 。
有关 ToString 的更多信息
https://docs.microsoft.com/dotnet/csharp/language-reference/builtin-types/record#built-in-formatting-for-display
特别声明:本站内容均来自网友提供或互联网,仅供参考,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
