具有最小 constructor/code 的不可变值对象
Immutable value object with minimal constructor/code
我需要一个对象的不可变实例,其中一些值在运行时定义,一些在编译时定义。理想情况下,它看起来像 Car
因为
它是不可变的
当值得到 added/removed
时,构造函数不必是 written/updated
无论何时定义值都可以组合在一起并且
初始化时可读性很好:
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 };
我需要一个对象的不可变实例,其中一些值在运行时定义,一些在编译时定义。理想情况下,它看起来像 Car
因为
它是不可变的
当值得到 added/removed
时,构造函数不必是 written/updated无论何时定义值都可以组合在一起并且
初始化时可读性很好:
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 };