【问题标题】:Is there anything similar to Java AutoValue in C#?C#中是否有类似于Java AutoValue的东西?
【发布时间】:2020-07-11 10:41:06
【问题描述】:

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

  • 使用最少的样板生成不可变的值类。
  • 自动为我处理诸如相等和哈希码之类的事情。
  • 理想情况下,让它自动生成一个构建器,以允许流畅的构造和任意验证,例如“如果您提供参数 A,则还必须提供 B”。
  • 同样,toBuilder() 样式的函数用于在进行一些修改的同时对现有实例进行深层复制。

使用 AutoValue,所有这些都将变得非常简单。有没有类似的?当然,我可以自己实现所有这些功能,但它有很多样板,使其更难维护且更容易出错。

【问题讨论】:

  • 也许 T4 模板可以完成这项工作?
  • 似乎该博客文章中讨论的记录概念实际上正是我想要的。多么及时!感谢您的链接。

标签: java c# auto-value


【解决方案1】:

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

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

然后你会得到:

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

顺便说一句,如果您刚刚从 Java 切换到 C#,您可能不知道 structs 是琐碎“记录”的值类型,from the docs:

结构最适合非常小的数据结构,这些结构主要包含在创建结构后不打算修改的数据。

虽然结构确实具有值相等的默认实现,但这可能是不可接受的,因为它只是 hashcode 中包含的第一个字段,并且您需要提供 operator == 的实现如果您愿意使用== 进行值相等。

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

【讨论】:

  • 是的,记录似乎与我想要的非常接近,只留下了建设者。可惜这个项目不是在几个月内完成的。
猜你喜欢
  • 2011-01-07
  • 1970-01-01
  • 1970-01-01
  • 2011-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-02
  • 2011-12-04
相关资源
最近更新 更多