C#9.0仅限 Init 的资源库

仅限 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的资源库。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容