在c#9中,init是什么意思?
我在c#9预览中遇到了c#中的“init”关键字。它意味着什么?它的应用是什么在c#9中,init是什么意思?,c#,C#,我在c#9预览中遇到了c#中的“init”关键字。它意味着什么?它的应用是什么 public class Person { private readonly string firstName; private readonly string lastName; public string FirstName { get => firstName; init => firstName = (value ?? thr
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”,但只允许在创建/初始化类时使用它 比如: 在此之后,您不允许更改FirstName或LastName 这将引发一种期待:
var p = new Person();
p.FirstName = "Adam";
init关键字创建所谓的仅限init的setter。他们在C#中添加了仅限init的属性和索引器的概念。这些属性和索引器可以在对象创建时设置,但只有在对象创建完成后才能有效获取 引入的主要原因是避免使用样板代码 像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 };
您可以在此处阅读包含更多详细信息和说明的提案:
这将是一个很好的功能,允许开发人员更有效地使用只读属性。这是一个例外还是编译时错误?据我所知,这是一个错误,比一个例外要好得多。正如你所提到的,根据提案,它只提到了错误,但没有提供更多的细节。但我猜它会像今天其他的setter一样工作,如果你只使用get(没有set),你会得到一个即时错误,我希望这也能工作。“通过允许调用方在构造过程中变异成员”-抱歉,这应该是“初始化过程中的成员”,不是在构造期间,因为在类型的构造函数完成之后和赋值之前,只调用init属性。
var p = new Point() { X = 42, Y = 13 };