仅限Init的资源库
在C# 9.0中,引入了 Init only setters,它提供了一种初始化对象成员的一致语法。属性初始化器清楚地表明哪个值正在设置哪个属性。缺点是这些属性必须是可设置的。使用 Init only setters,您可以为属性和索引器创建 init 访问器而不是 set 访问器。调用者可以使用属性初始化器语法在创建表达式中设置这些值,但是一旦构造完成,这些属性就是只读的。Init only setters 提供了一个更改状态的窗口。当构造阶段结束时,该窗口关闭。构造阶段在所有初始化(包括属性初始化器和 with-expressions)完成后有效结束。
在本文中,我们将详细介绍 C# 9.0 中 Init only setters 的功能,每个功能都会包含示例。
# 创建 Init only setters
要创建 Init only setters,我们需要使用 init 访问器而不是 set 访问器。以下是一个示例:
public class Person
{
public string FirstName { get; init; }
public string LastName { get; init; }
}
在这个示例中,我们创建了一个名为 Person 的类,该类有两个属性 FirstName 和 LastName,它们都使用 init 访问器。
使用 Init only setters 时,属性只能在构造函数或初始化器中设置。以下是一个示例:
var person = new Person
{
FirstName = "John",
LastName = "Doe"
};
在这个示例中,我们使用属性初始化器语法为 FirstName 和 LastName 设置值。
# 区别于只读属性
与只读属性不同,Init only setters 的值可以在对象初始化之后更改。以下是一个示例:
public class Person
{
public string FirstName { get; init; }
public string LastName { get; init; }
public string FullName => $"{FirstName} {LastName}";
}
var person = new Person
{
FirstName = "John",
LastName = "Doe"
};
Console.WriteLine(person.FullName); // Output: John Doe
person.FirstName = "Jane";
person.LastName = "Doe";
Console.WriteLine(person.FullName); // Output: Jane Doe
在这个示例中,我们创建了一个名为 Person 的类,它有两个属性 FirstName 和 LastName,以及一个只读属性 FullName,该属性返回 FirstName 和 LastName 的组合。我们在初始化期间为 FirstName 和 LastName 设置值,然后更改 FirstName 的值并输出 FullName,以查看它是否反映了新值。
# 检查构造结束
使用 Init only setters,您可以在构造阶段之后防止属性的更改。以下是一个示例:
public class Person
{
public string FirstName { get; init; }
public string LastName { get; init; }
public bool IsInitialized { get; private set; }
public void Initialize()
{
// Perform initialization logic here
IsInitialized = true;
}
}
var person = new Person
{
FirstName = "John",
LastName = "Doe"
};
person.Initialize();
person.FirstName = "Jane";
在这个示例中,我们创建了一个名为 Person 的类,它有两个属性 FirstName 和 LastName,以及一个名为 IsInitialized 的属性。我们还创建了一个名为 Initialize 的方法,该方法执行初始化逻辑并将 IsInitialized 设置为 true。
在初始化期间,我们为 FirstName 和 LastName 设置了值,然后调用 Initialize 方法。在 Initialize 方法之后,我们尝试更改 FirstName 的值,但由于 IsInitialized 设置为 true,FirstName 是只读的,所以我们无法更改它的值。
# 使用 with 表达式
与 Init only setters 一起使用的另一个功能是 with 表达式。使用 with 表达式,您可以轻松地创建一个新对象,其中某些属性的值已更改。以下是一个示例:
public class Person
{
public string FirstName { get; init; }
public string LastName { get; init; }
}
var person1 = new Person
{
FirstName = "John",
LastName = "Doe"
};
var person2 = person1 with { FirstName = "Jane" };
Console.WriteLine($"Person 1: {person1.FirstName} {person1.LastName}"); // Output: Person 1: John Doe
Console.WriteLine($"Person 2: {person2.FirstName} {person2.LastName}"); // Output: Person 2: Jane Doe
在这个示例中,我们创建了一个名为 Person 的类,它有两个属性 FirstName 和 LastName。我们首先创建一个名为 person1 的对象,并设置 FirstName 和 LastName 的值。然后,我们使用 with 表达式创建一个名为 person2 的新对象,并更改 FirstName 的值。我们在输出语句中验证了这些更改。
# 总结
在本文中,我们详细介绍了 C# 9.0 中的 Init only setters 的功能。我们了解了如何创建 Init only setters,如何使用属性初始化器和 with 表达式设置属性的值,以及如何在构造阶段之后防止属性的更改。我们还学习了与只读属性的区别,以及如何使用 Init only setters 和 with 表达式轻松创建新对象。