推荐答案
在 C# 9.0 中引入了 init 访问器,它允许在对象初始化期间设置属性值,但在初始化完成后,属性将变为只读。init 访问器通常用于不可变对象的创建。
// www.javascriptcn.com code example
public class Person
{
public string FirstName { get; init; }
public string LastName { get; init; }
}
// 使用对象初始化器设置属性
var person = new Person
{
FirstName = "John",
LastName = "Doe"
};
// 以下代码将导致编译错误,因为属性是只读的
// person.FirstName = "Jane";本题详细解读
init 访问器的背景
在 C# 9.0 之前,创建不可变对象通常需要定义只读字段或属性,并通过构造函数来初始化这些字段或属性。这种方式虽然有效,但在某些情况下会导致代码冗长且不够直观。为了解决这个问题,C# 9.0 引入了 init 访问器。
init 访问器的特点
初始化期间可写:
init访问器允许在对象初始化期间设置属性值。这意味着你可以在对象初始化器或构造函数中为属性赋值。初始化后只读:一旦对象初始化完成,属性将变为只读,无法再修改其值。这确保了对象的不可变性。
与
readonly的区别:init访问器与readonly字段不同。readonly字段只能在构造函数中赋值,而init访问器可以在对象初始化期间赋值。
使用场景
init 访问器非常适合用于创建不可变对象,尤其是在需要确保对象在初始化后不会被修改的场景中。例如,DTO(数据传输对象)、配置对象或领域模型中的值对象。
示例代码
// www.javascriptcn.com code example
public class Configuration
{
public string ServerUrl { get; init; }
public int Port { get; init; }
}
// 使用对象初始化器设置属性
var config = new Configuration
{
ServerUrl = "https://example.com",
Port = 8080
};
// 以下代码将导致编译错误,因为属性是只读的
// config.ServerUrl = "https://another.com";注意事项
init访问器只能在 C# 9.0 及更高版本中使用。init访问器不能与set访问器同时使用。init访问器可以用于自动实现的属性,也可以用于显式实现的属性。
通过使用 init 访问器,C# 提供了一种简洁且安全的方式来创建不可变对象,同时保持了代码的可读性和易用性。