C# 9 引入了记录引用类型。一条记录提供了一些合成方法,如复制构造函数、克隆操作、哈希码计算和比较/相等操作。在我看来,使用记录而不是一般的类很方便。有理由不这样做吗?
在我看来,目前作为编辑器的 Visual Studio 不支持记录和类,但这在未来可能会改变。
首先,请注意,如果一个类可能包含循环引用(对于大多数可变类来说都是如此),那么许多自动生成的record成员都可以使用 StackOverflow。所以这是不为所有事情使用记录的一个很好的理由。
那么什么时候应该使用record?
record当一个类的实例完全由它包含的公共数据定义并且没有它自己的唯一标识时,请使用 a 。
这意味着记录基本上只是一个不可变的数据包。我根本不关心记录的那个特定实例,除了它提供了一种将相关数据位组合在一起的便捷方法。
为什么?
考虑记录生成的成员:
如果记录的两个实例具有相同的数据(默认情况下:如果所有字段都相同),则认为它们相等。
这适用于没有行为的类,它们只是用作不可变的数据包。然而,对于可变或具有行为的类,这种情况很少发生。
例如,如果一个类是可变的,那么碰巧包含相同数据的两个实例不应该被认为是相等的,因为这意味着更新一个会更新另一个,这显然是错误的。相反,您应该对此类对象使用引用相等性。
同时,如果一个类是一个提供服务的抽象,你必须更仔细地考虑平等意味着什么,或者它是否与你的类相关。例如,想象一个Crawler可以抓取网站并返回页面列表的类。对于这样的阶级,平等意味着什么?你很少有 a 的两个实例Crawler,如果有,你为什么要比较它们?
with 块withblocks 提供了一种复制对象和更新特定字段的便捷方式。然而,如果对象没有身份,这总是安全的,因为复制它不会丢失任何信息。复制可变类会丢失原始对象的身份,因为更新副本不会更新原始对象。因此,您必须考虑这对您的班级是否真的有意义。
ToString生成的ToString打印出所有公共属性的值。如果您的类完全由它包含的属性定义,那么这很有意义。但是,如果您的类不是,那么这不一定是您感兴趣的信息。Crawler例如,A可能根本没有公共字段,但私有字段可能与其行为高度相关。您可能希望ToString为此类类定义自己。
| 归档时间: |
|
| 查看次数: |
331 次 |
| 最近记录: |