"Init only setters" 提供了什么,与 C# 中的只读有什么区别

What "Init only setters" provides and what is the difference to the readonly one in C#

我可以像下面这样定义 class:

public class MyClass
{
  public int Id { get; }
  public MyClass(int id) => Id = id;
}

而且我必须从构造函数中定义 Id,它将是只读的。

但是如果我想在 C# 9.0 中使用 Init only setters,它是什么以及如何使用它?

public class MyClass
{
  public int Id { get; init; }
}

简而言之:

var obj = new MyClass
{
    Id = 42 // totally fine
};

obj.Id = 43; // not OK, we're not initializing

在这种情况下微不足道,与使用构造函数参数没有太大区别,但在一些更复杂的场景中很有用,在这些场景中,您不需要 200 个构造函数参数,但 想要一旦构建,它在外部是不可变的。

Init only setters 提供一致的语法来初始化对象的成员。 属性 初始化程序清楚地表明哪个值正在设置哪个 属性。缺点是这些属性必须是可设置的。

这样一来,您就不需要在开始时提供值和构造函数,您可以在之后进行:

var myClass = new MyClass 
{ 
   Id = 10 
}

并且会被封印,不能再更改

myClass.Id = 43; // not allowed

阅读more info