主页 > 精品文章 > 后端开发 > C# 完整初始化器详解(对象初始化、集合初始化、字典初始化、只读初始化、主构造结合)

标签推荐

>> 更多

C# 完整初始化器详解(对象初始化、集合初始化、字典初始化、只读初始化、主构造结合)

 2026-07-15

PART 01

 
什么是初始化器
 
 
初始化器是语法糖,简化new创建实例后批量赋值属性/元素,编译后等价于先构造实例,再逐行赋值,运行无性能损耗。 分为四大类:对象初始化器、集合初始化器、字典初始化器、索引初始化器。
 

PART 02

 
对象初始化器 Object Initializer
 
 
 
 
1. 基础用法
无需写多行赋值,new 类名 { 属性1=值, 属性2=值 }
  •  
public class User
{
public long Id { get; set; }
public string Name { get; set; }
}
// 初始化器写法
var user = new User
{
Id = 1,
Name = "张三"
};
// 编译器展开等价代码
User user = new User();
user.Id = 1;
user.Name = "张三";
2. 搭配构造函数混用
可以先传构造参数,再初始化属性:
  •  
public class User
{
public User(long id)
{
Id = id;
}
public long Id { get; set; }
public string Name { get; set; }
}
var u = new User(1001)
{
Name = "李四"
};
 
 
3. init 只读属性初始化(C#9+)
init仅允许构造函数、对象初始化器赋值,后续不可修改,适合不可变模型
  •  
public record User(long Id, string Name)
{
public string Remark { get; init; }
}
var u = new User(1, "小明")
{
Remark = "测试用户"
};
// u.Remark = ""; 编译报错,无法修改
 
 
4. record 主构造 + 对象初始化器
  •  
public record Order(long OrderId, decimal Amount)
{
public string Status { get; init; }
}
var order = new Order(100, 99.9m)
{
Status = "已支付"
};
 
 
5. 嵌套对象初始化
实体内部包含子对象,可连续初始化:
  •  
public class Order
{
public long Id { get; set; }
public User Buyer { get; set; }
}
var order = new Order
{
Id = 1,
Buyer = new User
{
Id = 10,
Name = "买家"
}
};
 

PART 03

 
集合初始化器 Collection Initializer
 
 
实现IEnumerable且拥有Add()方法的类型都支持,ListHashSetQueueStack 全部可用。
 
 
1. List
  •  
List<int> list = new List<int> { 1, 2, 3, 4 };
// 编译展开
List<int> list = new List<int>();
list.Add(1);
list.Add(2);
list.Add(3);
list.Add(4);
 
 
2. HashSet
  •  
var set = new HashSet<string> { "A", "B", "C" };
 
 
3. Queue / Stack
  •  
var queue = new Queue<int> { 10, 20, 30 };
var stack = new Stack<int> { 1, 2 };
 
 
4. 自定义类支持集合初始化器
只要提供无参Add方法即可:
  •  
public class MyCollection : IEnumerable<int>
{
private List<int> _data = new();
public void Add(int num) => _data.Add(num);
public IEnumerator<int> GetEnumerator() => _data.GetEnumerator();
IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
}
// 可以使用集合初始化器
var coll = new MyCollection { 1, 3, 5 };
 

PART 04

 
字典初始化器 Dictionary Initializer
 
 
两种写法,底层都是调用Add(key,value)
 
 
写法1:索引赋值式(推荐,C#6+)
  •  
var dict = new Dictionary<long, string>
{
[1] = "张三",
[2] = "李四"
};
// 等价
dict[1] = "张三";
dict[2] = "李四";
 
 
写法2:传统键值对构造
  •  
var dict = new Dictionary<int, string>
{
{ 1, "A" },
{ 2, "B" }
};
// 等价 dict.Add(1,"A");
 

PART 05

 
数组初始化器
 
 
 
 
简洁数组
  •  
int[] arr = { 1, 2, 3 };
int[] arr2 = new int[] { 10, 20 };
 
 
交错数组
  •  
int[][] jagged = new int[][]
{
new int[] {1,2},
new int[] {3,4,5}
};
 

PART 06

 
初始化器关键特性与规则
 
 
  • 执行顺序先执行构造函数 → 再执行初始化器赋值;
  •  
  var u = new User(1) { Name = "xx" };
  // 1. User(1) 构造执行
  // 2. Name 赋值
  • 仅能赋值可访问的属性/字段(public,或内部可访问);
  • 不能在初始化器内调用方法、写复杂逻辑,只能常量/简单表达式;
  • readonly普通字段不能在对象初始化器赋值,仅构造函数可赋值;init属性可以。
  • 初始化器不会触发重载构造,只是构造后追加赋值。
 

PART 07

 
初始化器优缺点
 
 
 
 
优点
  • 代码集中,创建对象时一次性看清所有字段赋值,可读性高;
  • 简化大量赋值模板代码,减少重复obj.XXX =
  • 支持不可变init模型,配合record打造干净DTO;
  • 集合、字典一行批量填充,不用多次Add。
 
 
缺点
  • 复杂逻辑无法写在初始化器内,只能简单赋值;
  • 大量嵌套初始化会造成代码层级过深,可读性下降;
  • 若构造内有复杂业务逻辑,再叠加初始化器赋值,顺序混乱不易排查。
 

PART 08

 
高频使用场景
 
 
  • DTO、返回实体、配置类快速构造;
  • 单元测试构造测试数据;
  • 静态只读全局集合初始化;
  • 简单缓存字典、固定枚举映射表;
  • record 不可变数据模型赋值扩展字段。
 

PART 09

 
避坑点
 
 
  • 不要依赖初始化器做数据校验:构造函数执行在前,初始化器在后,中间会出现对象不完整的中间状态;
  • 多线程场景:初始化仅构造阶段安全,后续修改仍需加锁;
  • 集合初始化器只是语法糖,底层多次Add,大数据量无预分配容量,会触发多次扩容GC;
  • 嵌套初始化层级太深建议拆分局部变量,提升可读性。

版权声明: 本站资源均来自互联网或会员发布,如果侵犯了您的权益请与我们联系,我们将在24小时内删除!谢谢!联系QQ:76900276

转载请注明: C# 完整初始化器详解(对象初始化、集合初始化、字典初始化、只读初始化、主构造结合)

嘿,我来帮您!