在 c# 9 中初始化是什么意思?

  • 本文关键字:是什么 初始化 c#
  • 更新时间 :
  • 英文 :


我在 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";

最新更新