java - C#中是否有类似于Java AutoValue的东西?
问题描述
在从事 Java 项目一段时间后又回到 C#,我发现自己真的很想念 AutoValue。具体来说,我希望能够:
- 用最少的样板生成一个不可变的值类。
- 自动为我处理诸如相等和哈希码之类的事情。
- 理想情况下,让它自动生成一个构建器以允许流畅的构造和任意验证,例如“如果你给参数 A,你也必须给 B”。
- 同样,toBuilder() 样式的函数可以在进行一些修改的同时对现有实例进行深层复制。
使用 AutoValue,所有这些都将变得非常容易。有没有类似的?当然,我可以自己实现所有这些功能,但它有很多样板,使其更难维护且更容易出错。
解决方案
根据您的描述,您似乎需要等到C#9 记录类型才能获得您对 java 的描述AutoValues
,即在 C#9 中,您应该能够声明:
public data class Person
{
public string FirstName { get; init; }
public string LastName { get; init; }
}
然后你会得到:
- 不可变行为
- C# 的对象初始化器语法的好处
- 相等和哈希码的自动默认实现
- 使用表达式将允许复制大多数属性,但允许在复制期间更改某些字段值。
在此期间(C#8 和更早版本),您需要手动完成其中的一些操作,即
- 将您的类属性声明为仅获取
- 通过构造函数初始化所有属性
- 创建您自己的静态工厂/构建器方法
- 使用IDE中的代码生成工具来生成相等成员
顺便说一句,如果您刚刚从 Java 切换到 C#,您可能不知道structs
琐碎的“记录”的值类型,来自文档:
结构最适合非常小的数据结构,这些数据结构主要包含在创建结构后不打算修改的数据。
尽管结构确实具有值相等的默认实现,但这可能是不可接受的,因为它只是hashcode中包含的第一个字段,并且如果要用于值相等,则需要提供operator ====
的实现.
也就是说,必须仔细考虑结构的用例,并且通常应仅用于琐碎的不可变记录或在数组中使用时出于性能原因。
推荐阅读
- excel - 如何通过 VBA 点击网页上的链接
- java - 我尝试将 android 项目与产生错误的 firebase 连接
- python - 在 pandas.DataFrame 中将列转换为标题
- epicorerp - BPM ABL 查询输出到 CSV 文件 - 示例
- ruby-on-rails - 为什么 AWS 上传文字文件路径,而不是上传图片?
- python-3.x - 转置列和数据引导
- python - 将 mediapipe iris tflite 转换为 tf/keras 作为预处理器
- jena - 如何用通用规则引擎中的内置 listContains 替换 SPARQL 中的 VALUES
- php - MongoDB 聚合 - 如何在 PHP 中使用?
- javascript - 有什么方法可以检测客户端是否下载了全图?