仅限 Init 的资源库
仅限init的资源库提供一致的语法来初始化对象成员*。属性厨师长设定项可明确哪个值正在设置哪个属性。缺点是这些属性必须是可设置的。从C#9.0开始,可谓属性和索引器创建init访问器,而不是set访问器。调用方法可使用属性初始化表达式语法在创建表达式中设置这些值,但构造完成后,这些属性将变为只读。仅限init的资源库提供了一个窗口来更改状态。构造阶段结束时,该窗口关闭。在完成所有初始化(包括属性初始化表达式和with表达式)之后,构造阶段实际上就结束了。
可在编写的任何类型中声明仅限init的资源库。例如,以下结构定义了天气观察结构:
public struct WeatherObservation
{
public DateTime RecordedAt{get;init;}
public decimal TemperatureInCelsius{get;init;}
pubilc decimal PressureInMillibars{get;init;}
public override string ToString()=>
$"At {RecordedAt:h:mm tt} on {RecordedAt : M/d/yyyy}"+
$"Temp = {TemperatureInCelsius}, with {PressureInMillibars} pressure";
}
调用方可食用属性初始化表达式语法来设置值,同时仍保留不变性:
var now = new WeatherObservation
{
RecordedAt = DateTime.Now,
TemperatureInCelsius = 20,
PressureInMillibars = 998.0m
};
但在初始化之后更改观察值是错误的,他会在初始化之外分配给仅限init的属性:
//Error! CS8852.
now.TemperatureInCelsius = 18;
对于从派生类设置基类属性,仅限init的资源库很有用。他们还可通过基类中的帮助程序来设置派生属性,位置记录使用权限init的资源库声明属性。这些设置器可在with表达式中使用。可为定义的任何class或者struct声明仅限init的资源库。