一、介绍
对象初始化器是在构造器后使用的初始化赋值补充语法。
在构造器后使用{},依次指定成员名和赋值表达式,以逗号进行分隔。
对象初始化器不能为只读字段赋值。(可以对具有init访问器的属性进行赋值)
一个实例构造出来的运行顺序
- 成员上赋值的初始值
- 构造器中的赋值
- 对象初始化器赋值
基本形式
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进行修饰。