“Init only setters”提供了什么以及与 C# 中的只读 setters 有何区别

Sas*_*asa 7 c# c#-9.0

我可以定义一个类,如下所示:

public class MyClass
{
  public int Id { get; }
  public MyClass(int id) => Id = id;
}
Run Code Online (Sandbox Code Playgroud)

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

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

public class MyClass
{
  public int Id { get; init; }
}
Run Code Online (Sandbox Code Playgroud)

Maj*_*vin 11

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

这样,您不需要在开头和构造函数中提供值,您可以在之后提供:

var myClass = new MyClass 
{ 
   Id = 10 
}
Run Code Online (Sandbox Code Playgroud)

并且它将被密封,您无法再更改它。

myClass.Id = 43; // not allowed
Run Code Online (Sandbox Code Playgroud)

阅读更多信息


Mar*_*ell 9

简而言之:

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

obj.Id = 43; // not OK, we're not initializing
Run Code Online (Sandbox Code Playgroud)

在这种情况下很简单,与使用构造函数参数没有太大区别,但在一些更复杂的场景中很有用,在这些场景中,您不需要 200 个构造函数参数,但您确实希望它在构造后表面上是不可变的。