我在 C# 9 预览版中遇到了 c# 中的">init"关键字。它是什么意思,它的应用是什么?
public class Person
{
private readonly string firstName;
private readonly string lastName;
public string FirstName
{
get => firstName;
init => firstName = (value ?? throw new ArgumentNullException(nameof(FirstName)));
}
public string LastName
{
get => lastName;
init => lastName = (value ?? throw new ArgumentNullException(nameof(LastName)));
}
}
init 关键字创建所谓的 Init Only Setters。它们将仅初始化属性和索引器的概念添加到 C#。这些属性和索引器可以在对象创建时设置,但只有在对象创建完成后才能有效地获取。
引入的主要原因是避免使用样板代码。
像 Point 这样的简单不可变对象需要:
struct Point
{
public int X { get; }
public int Y { get; }
public Point(int x, int y)
{
this.X = x;
this.Y = y;
}
}
init 访问器允许调用方在构造操作期间改变成员,从而使不可变对象更加灵活。这意味着对象的不可变属性可以参与对象初始值设定项,从而消除了对类型中所有构造函数样板的需求。点类型现在很简单:
struct Point
{
public int X { get; init; }
public int Y { get; init; }
}
然后,使用者可以使用对象初始值设定项来创建对象
var p = new Point() { X = 42, Y = 13 };
您可以在此处阅读包含更多详细信息和解释的提案:
https://github.com/dotnet/csharplang/blob/c2df2ee72f4b36fca2e07c701a90a0dba8d1fc20/proposals/init.md
init 就像旧的"set",但你只能在创建/初始化类时使用它。
喜欢:
var p = new Person { FirstName = "Adam", LastName = "West" };
之后,您不得更改名字或姓氏。
这将抛出一个期望:
var p = new Person();
p.FirstName = "Adam";