c# init
在 C# 9 中引入的 init
访问修饰符是一项新特性,它允许对对象的属性进行初始化,但在对象创建后则无法修改。这种方式提供了一种更安全的方式来创建不可变对象(immutable objects)。
使用场景
init 关键字主要用于对象初始化过程中的属性设置,确保在对象被创建后,属性不会被意外更改。这在定义数据传输对象(DTO)、配置类或其他不需要修改的对象时非常有用。
语法及示例
public class Person
{
// 使用 init 关键字的属性
public string Name { get; init; }
public int Age { get; init; }
}
class Program
{
static void Main()
{
// 使用对象初始化器创建一个 Person 对象
var person = new Person
{
Name = "Alice",
Age = 30
};
// 输出属性值
Console.WriteLine($"Name: {person.Name}, Age: {person.Age}");
// 试图修改已创建对象的属性将导致编译错误
// person.Name = "Bob"; // 编译时错误
}
}
在上面的示例中,Person 类的 Name 和 Age 属性都使用了 init 修饰符。当我们创建 Person 对象并使用对象初始化器设置这些属性时,它们可以被设置,但是在对象创建后,试图修改这些属性将会导致编译错误。
例子中的关键点
初始化时设置
:在对象初始化期间(通过 {} 语法),可以设置带有 init 的属性。
只能初始化一次:一旦对象创建完成,init 属性将不能被修改,提供了不可变的效果。
便于创建不可变对象
:使用 init 属性可以方便地实现不可变对象的创建模式,这在许多设计模式和编程范式中非常重要。
结合记录类型
init 关键字通常与记录类型(record type)结合使用,记录类型本身就是为了创建不可变的对象而设计的。C# 9 引入的记录类型允许更简单的语法用于创建不可变数据对象。
示例:
public record Person
{
public string Name { get; init; }
public int Age { get; init; }
}
class Program
{
static void Main()
{
var person = new Person
{
Name = "Alice",
Age = 30
};
Console.WriteLine($"Name: {person.Name}, Age: {person.Age}");
// person.Name = "Bob"; // 编译时错误
}
}