我在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就像旧的'set',但是只允许在创建/初始化类时使用它。
赞:
var p = new Person { FirstName = "Adam", LastName = "West" };
此后,您将无法更改名字或姓氏。
这将引发期望:
var p = new Person();
p.FirstName = "Adam";
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访问器通过允许调用者在构造过程中对成员进行变异来使不可变对象更加灵活。这意味着对象的不可变属性可以参与对象初始化程序,从而消除了该类型中所有构造函数样板的需要。 Point类型现在很简单:
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