在 C# 中有类似于 Java AutoValue 的东西吗?

Is there anything similar to Java AutoValue in C#?

在 Java 项目上工作了一段时间然后又回到 C# 之后,我发现自己真的很想念 AutoValue。具体来说,我希望能够:

有了 AutoValue,所有这一切都会变得非常容易。有什么类似的吗?当然,我可以自己实现所有这些功能,但它有很多样板,使其更难维护且更容易出错。

根据您的描述,您似乎需要等到 C#9 record types 才能获得您描述的 java 的 AutoValues,即在 C#9 中,你应该能够声明:

public data class Person
{
    public string FirstName { get; init; }
    public string LastName { get; init; }
}

您将获得:

在此期间(C#8 和之前的版本),您需要手动完成其中的一些工作,即

  • 将您的 class 属性声明为 get only
  • 通过构造函数初始化所有属性
  • 创建您自己的静态工厂/构建器方法
  • 使用code generation tools in IDE's like生成相等成员

顺便说一句,如果您刚从 Java 切换到 C#,您可能不知道 structs 作为普通 'records' 的值类型,from the docs:

Structs are best suited for very small data structures that contain primarily data that is not intended to be modified after the struct is created.

虽然结构确实有值相等的默认实现,但如果您想使用 == 实现值相等,这可能是不可接受的,因为它只是 hashcode, and that you'd need to provide an implementation of operator == 中包含的第一个字段。

也就是说,structs must be carefully considered 的用例,通常只应用于琐碎的不可变记录或出于性能原因在数组中使用时。