C#对象初始化器

简介: C#对象初始化器


一、介绍

对象初始化器是在构造器后使用的初始化赋值补充语法。

在构造器后使用{},依次指定成员名和赋值表达式,以逗号进行分隔。

对象初始化器不能为只读字段赋值。(可以对具有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进行修饰。

相关文章
|
7月前
|
C# 开发者
C# 9.0中的模块初始化器:程序启动的新控制点
【1月更文挑战第14天】本文介绍了C# 9.0中引入的新特性——模块初始化器(Module initializers)。模块初始化器允许开发者在程序集加载时执行特定代码,为类型初始化提供了更细粒度的控制。文章详细阐述了模块初始化器的语法、用途以及与传统类型初始化器的区别,并通过示例代码展示了如何在实际项目中应用这一新特性。
|
7月前
|
Java C#
C# 面向对象编程解析:优势、类和对象、类成员详解
OOP代表面向对象编程。 过程式编程涉及编写执行数据操作的过程或方法,而面向对象编程涉及创建包含数据和方法的对象。 面向对象编程相对于过程式编程具有几个优势: OOP执行速度更快,更容易执行 OOP为程序提供了清晰的结构 OOP有助于保持C#代码DRY("不要重复自己"),并使代码更易于维护、修改和调试 OOP使得能够创建完全可重用的应用程序,编写更少的代码并减少开发时间 提示:"不要重复自己"(DRY)原则是有关减少代码重复的原则。应该提取出应用程序中常见的代码,并将其放置在单一位置并重复使用,而不是重复编写。
74 0
|
2月前
|
编译器 C#
C#多态概述:通过继承实现的不同对象调用相同的方法,表现出不同的行为
C#多态概述:通过继承实现的不同对象调用相同的方法,表现出不同的行为
123 65
|
1月前
|
JSON 程序员 C#
使用 C# 比较两个对象是否相等的7个方法总结
比较对象是编程中的一项基本技能,在实际业务中经常碰到,比如在ERP系统中,企业的信息非常重要,每一次更新,都需要比较记录更新前后企业的信息,直接比较通常只能告诉我们它们是否指向同一个内存地址,那我们应该怎么办呢?分享 7 个方法给你!
|
3月前
|
C# 数据安全/隐私保护
C# 一分钟浅谈:类与对象的概念理解
【9月更文挑战第2天】本文从零开始详细介绍了C#中的类与对象概念。类作为一种自定义数据类型,定义了对象的属性和方法;对象则是类的实例,拥有独立的状态。通过具体代码示例,如定义 `Person` 类及其实例化过程,帮助读者更好地理解和应用这两个核心概念。此外,还总结了常见的问题及解决方法,为编写高质量的面向对象程序奠定基础。
27 2
|
7月前
|
C#
C#的类和对象的概念学习案例刨析
【5月更文挑战第17天】C#是一种面向对象的语言,以类和对象为核心。类作为对象的模板,定义了属性(如Name, Age)和行为(如Greet)。对象是类的实例,可设置属性值。封装通过访问修饰符隐藏实现细节,如Customer类的私有name字段通过Name属性访问。继承允许新类(如Employee)从现有类(Person)继承并扩展。多态让不同对象(如Circle, Square)共享相同接口(Shape),实现抽象方法Area,提供灵活的代码设计。
68 1
|
7月前
|
自然语言处理 C# 数据安全/隐私保护
50.c#:string类初始化
50.c#:string类初始化
257 1
|
7月前
|
存储 C#
C#对象和类
C#对象和类
46 0
|
7月前
|
存储 C#
C#基础语法(类和对象)
C#基础语法(类和对象)
44 2