C#对象初始化器

文章目录

  • 一、介绍
  • 二、应用
    • 2.1 例子
    • 2.2 对象克隆器
    • 2.3 集合初始化
    • 2.4 匿名类
    • 2.5 所需成员

一、介绍

对象初始化器是在构造器后使用的初始化赋值补充语法。
在构造器后使用{},依次指定成员名和赋值表达式,以逗号进行分隔。
对象初始化器不能为只读字段赋值。(可以对具有init访问器的属性进行赋值)

一个实例构造出来的运行顺序

  1. 成员上赋值的初始值
  2. 构造器中的赋值
  3. 对象初始化器赋值

基本形式

new 类名(参数){初始化表达式1, 初始化表达式2};

无参构造器使用对象初始化器,可以省略括号

new 类名{初始化表达式1, 初始化表达式2};

二、应用

2.1 例子

using System;

namespace PropertyDemo
{
    internal class Program
    {
        static void Main(string[] args)
        {
            InitializationDemo initializationDemo = new InitializationDemo(0) {  Num2=2,num3=3 };
            initializationDemo.ShowNum();

            Console.ReadKey();
        }
    }

    public class InitializationDemo
    {
        private int num1;
        private int num2;
        public  int num3;

        public int Num2
        {
            get => num2;
            set => num2 = value;
        }

        public InitializationDemo(int num1)
        {
            this.num1 = num1;
        }
        public void ShowNum()
        {
            Console.WriteLine("num1:{0},num2:{1},num3:{2}", num1, num2, num3);
        }
    }
}

2.2 对象克隆器

对于记录类型和结构类型可以使用with克隆目标的值,并使用对象初始化器修改一些值。

Point p1 = new Point() { X = 3, Y = 4 };
Point p2 = p2 with { X = 5 };

克隆的过程不会经过赋值操作(set访问器),但之后的对象初始化器的赋值会触发赋值。

2.3 集合初始化

实现了IEnumerable接口并且具有Add方法的类型,可以在对象初始化器中传入多个元素,这些元素会作为参数依序调用Add方法。

System.Collections.ArrayList list = 
              new System.Collections.ArrayList() { 1, 2, 3 };

2.4 匿名类

匿名类是一种临时类,没有名字,必须通过var来推断类型。
和元组类似,用于打包一系列的值。但这些值是只读属性,不能更改。
匿名类型的语法是使用new关键字和对象初始化器,指定属性的名称和值。

var person = new { Name = "Alice", Age = 20 };

2.5 所需成员

暴露的并且可更改的成员,可以添加required进行修饰。
创建实例时会要求必须使用对象初始化器对他们进行赋值。

class Student
{
    public required int Age { get; set; }
    public required string Name;
}
Student st = new Student { Age=20,Name="小明" };

在派生类中,重写这些成员时,需要沿用required进行修饰。

你可能感兴趣的:(C#,c#,开发语言)