在 C# 中有类似于 Java AutoValue 的东西吗?
Is there anything similar to Java AutoValue in C#?
在 Java 项目上工作了一段时间然后又回到 C# 之后,我发现自己真的很想念 AutoValue。具体来说,我希望能够:
- 使用最少的样板生成不可变值class。
- 自动为我处理诸如相等性和哈希码之类的事情。
- 理想情况下,让它自动生成一个构建器以允许流畅的构建和任意验证,例如“如果你给参数 A,你还必须给 B”。
- 同样,toBuilder() 风格的函数可以在进行一些修改的同时对现有实例进行深度复制。
有了 AutoValue,所有这一切都会变得非常容易。有什么类似的吗?当然,我可以自己实现所有这些功能,但它有很多样板,使其更难维护且更容易出错。
根据您的描述,您似乎需要等到 C#9 record types 才能获得您描述的 java 的 AutoValues
,即在 C#9 中,你应该能够声明:
public data class Person
{
public string FirstName { get; init; }
public string LastName { get; init; }
}
您将获得:
- 不可变行为
- C#'s object initialiser syntax
的好处
- equality and hashcode
的自动默认实现
- With expressions 将允许复制大多数属性,但允许在复制过程中更改某些字段值。
在此期间(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 的用例,通常只应用于琐碎的不可变记录或出于性能原因在数组中使用时。
在 Java 项目上工作了一段时间然后又回到 C# 之后,我发现自己真的很想念 AutoValue。具体来说,我希望能够:
- 使用最少的样板生成不可变值class。
- 自动为我处理诸如相等性和哈希码之类的事情。
- 理想情况下,让它自动生成一个构建器以允许流畅的构建和任意验证,例如“如果你给参数 A,你还必须给 B”。
- 同样,toBuilder() 风格的函数可以在进行一些修改的同时对现有实例进行深度复制。
有了 AutoValue,所有这一切都会变得非常容易。有什么类似的吗?当然,我可以自己实现所有这些功能,但它有很多样板,使其更难维护且更容易出错。
根据您的描述,您似乎需要等到 C#9 record types 才能获得您描述的 java 的 AutoValues
,即在 C#9 中,你应该能够声明:
public data class Person
{
public string FirstName { get; init; }
public string LastName { get; init; }
}
您将获得:
- 不可变行为
- C#'s object initialiser syntax 的好处
- equality and hashcode 的自动默认实现
- With expressions 将允许复制大多数属性,但允许在复制过程中更改某些字段值。
在此期间(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 的用例,通常只应用于琐碎的不可变记录或出于性能原因在数组中使用时。