当前位置: 首页 > article >正文

windows C#-对象和集合初始值设定项(中)

带 init 访问器的对象初始值设定项

确保无人更改设计,并且可以使用访问器来限制 init 对象。 它有助于限制属性值的设置。

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

// The `LastName` property can be set only during initialization. It CAN'T be modified afterwards.
// The `FirstName` property can be modified after initialization.
var pet = new Person() { FirstName = "Joe", LastName = "Doe"};

// You can assign the FirstName property to a different value.
pet.FirstName = "Jane";

// Compiler error:
// Error CS8852  Init - only property or indexer 'Person.LastName' can only be assigned in an object initializer,
//               or on 'this' or 'base' in an instance constructor or an 'init' accessor.
// pet.LastName = "Kowalski";

必需的仅限 init 的属性支持不可变结构,同时允许该类型用户使用自然语法。

具有类类型属性的对象初始值设定项

初始化对象时,考虑类类型属性的含义至关重要:

public class HowToClassTypedInitializer
{
    public class EmbeddedClassTypeA
    {
        public int I { get; set; }
        public bool B { get; set; }
        public string S { get; set; }
        public EmbeddedClassTypeB ClassB { get; set; }

        public override string ToString() => $"{I}|{B}|{S}|||{ClassB}";

        public EmbeddedClassTypeA()
        {
            Console.WriteLine($"Entering EmbeddedClassTypeA constructor. Values are: {this}");
            I = 3;
            B = true;
            S = "abc";
            ClassB = new() { BB = true, BI = 43 };
            Console.WriteLine($"Exiting EmbeddedClassTypeA constructor. Values are: {this})");
        }
    }

    public class EmbeddedClassTypeB
    {
        public int BI { get; set; }
        public bool BB { get; set; }
        public string BS { get; set; }

        public override string ToString() => $"{BI}|{BB}|{BS}";

        public EmbeddedClassTypeB()
        {
            Console.WriteLine($"Entering EmbeddedClassTypeB constructor. Values are: {this}");
            BI = 23;
            BB = false;
            BS = "BBBabc";
            Console.WriteLine($"Exiting EmbeddedClassTypeB constructor. Values are: {this})");
        }
    }

    public static void Main()
    {
        var a = new EmbeddedClassTypeA
        {
            I = 103,
            B = false,
            ClassB = { BI = 100003 }
        };
        Console.WriteLine($"After initializing EmbeddedClassTypeA: {a}");

        var a2 = new EmbeddedClassTypeA
        {
            I = 103,
            B = false,
            ClassB = new() { BI = 100003 } //New instance
        };
        Console.WriteLine($"After initializing EmbeddedClassTypeA a2: {a2}");
    }

    // Output:
    //Entering EmbeddedClassTypeA constructor Values are: 0|False||||
    //Entering EmbeddedClassTypeB constructor Values are: 0|False|
    //Exiting EmbeddedClassTypeB constructor Values are: 23|False|BBBabc)
    //Exiting EmbeddedClassTypeA constructor Values are: 3|True|abc|||43|True|BBBabc)
    //After initializing EmbeddedClassTypeA: 103|False|abc|||100003|True|BBBabc
    //Entering EmbeddedClassTypeA constructor Values are: 0|False||||
    //Entering EmbeddedClassTypeB constructor Values are: 0|False|
    //Exiting EmbeddedClassTypeB constructor Values are: 23|False|BBBabc)
    //Exiting EmbeddedClassTypeA constructor Values are: 3|True|abc|||43|True|BBBabc)
    //Entering EmbeddedClassTypeB constructor Values are: 0|False|
    //Exiting EmbeddedClassTypeB constructor Values are: 23|False|BBBabc)
    //After initializing EmbeddedClassTypeA a2: 103|False|abc|||100003|False|BBBabc
}

以下示例演示了对于 ClassB,初始化过程如何涉及到更新特定的值,同时保留原始实例中的其他值。 初始值设定项重用当前实例:ClassB 的值为:100003(此处分配的新值)、true(在 EmbeddedClassTypeA 的初始化中保留的值)、BBBabc(EmbeddedClassTypeB 中未更改的默认值)。


http://www.kler.cn/a/451073.html

相关文章:

  • 振动分析-46-设备振动监测和故障诊断能力提升需要理解和掌握的知识体系
  • C语言结构体位定义(位段)的实际作用深入分析
  • 基于Spring Boot的工商局商家管理系统
  • Vue.js前端框架教程11:Vue监听器watch和watchEffect
  • LeetCode 热题 100_LRU 缓存(35_146_中等_C++)(哈希表 + 双向链表)(构造函数声明+初始化列表=进行变量初始化和赋值)
  • vue3项目history路由模式部署上线405、刷新404问题(包括部分页面刷新404问题)
  • RustDesk远程及自建服务器搭建教程
  • Java/JDK下载、安装及环境配置超详细教程【Windows10、macOS和Linux图文详解】
  • 国标GB28181设备管理软件EasyGBS:P2P远程访问故障排查指南(设备端)
  • 自然语言处理与知识图谱的融合与应用
  • K8s - openeuler2203SP1安装 K8s + flannel
  • 浅谈 前端验证码那些事
  • STM32 与 AS608 指纹模块的调试与应用
  • keepalived踩坑记录
  • 前端:纯前端快速实现html导出word和pdf
  • 【EthIf-13】EthIfGeneral容器配置-01
  • IDEA使用Alt + Enter快捷键自动接受返回值一直有final修饰的问题处理
  • 重温设计模式--中介者模式
  • 微积分复习笔记 Calculus Volume 2 - 5.1 Sequences
  • Golang并发机制以及它所使⽤的CSP并发模型
  • [LeetCode-Python版]相向双指针——18. 四数之和
  • MySQL什么情况下会导致索引失效
  • 关于C语言库的调用
  • 如何编译Opencv +ffmpeg linux 明明安装了ffmpeg但是opencv就是找不到
  • Flutter 基础知识总结
  • vmime.net_4.dll详解:它是什么,有何用途?