具有最小 constructor/code 的不可变值对象

Immutable value object with minimal constructor/code

我需要一个对象的不可变实例,其中一些值在运行时定义,一些在编译时定义。理想情况下,它看起来像 Car 因为

  1. 它是不可变的

  2. 当值得到 added/removed

    时,构造函数不必是 written/updated
  3. 无论何时定义值都可以组合在一起并且

  4. 初始化时可读性很好:

    struct Car {
       public string Name { get; init; }
       public uint CountWheels { get; } = 4; 
     }
    
     Car carBrand = new() {Name = "CarBrand"}
    

问题是,它不起作用:

A 'struct' with field initializers must include an explicitly declared constructor.

我怎样才能用最少的代码解决这个问题?

评论的答案:任何结构、记录、class 等都可以

我想你需要的是记录:

public record Car(string Name, int CountWheels = 4);

这使得它不可变,并且代码最少。

为其提供所需的构造函数:

struct Car {
   public string Name { get; init; }
   public uint CountWheels { get; } = 4; 
   public Car(string name) {Name = name;}
 }

 var carBrand = new Car("CarBrand");

我也同意那些认为这应该仍然是 class 或者可能是记录的人。

如果你真的想要一个结构:

public readonly record struct Car(string Name, int CountWheels)
{
    public int CountWheels { get; init; } = 4;
}

但请注意,结构是按值传递的,这意味着每次传递它们时都会复制它们(除非您使用 ref)。因此,如果您有一个大型结构,使用记录 (class) 可能是更好的主意,因为它是通过引用传递的。

没有主构造函数的记录 class 将如下所示:

public record Car
{
    public string Name { get; init; }
    public int CountWheels { get; init; } = 4;
}

然后您可以使用 with 关键字来复制某些属性已更改的记录:

Car car = new() { Name = "CarBrand" };
var carCopy = car with { CountWheels = 6 };