C# 9 中的 Init-Only 和 ReadOnly 有什么区别?

What is difference between Init-Only and ReadOnly in C# 9?

我正在查看 C# 9 new features which will be released soon. Init-Only 正在引入属性。

今天的一个很大的限制是属性必须是可变的,对象初始化器才能工作:它们通过首先调用对象的构造函数(在本例中是默认的无参数构造函数)然后分配给 属性 二传手。

Init-only 属性解决了这个问题!他们引入了一个 init 访问器,它是 set 访问器的变体,只能在对象初始化期间调用:

public class Person
{
    public string FirstName { get; init; }
    public string LastName { get; init; }
}

有了这个声明,上面的客户端代码仍然合法,但是任何后续对 FirstName 和 LastName 属性的赋值都是错误的。 这行是什么意思?如果 ReadOnly 也做同样的事情那么 Init-Only 属性.

有什么用

如新 C# 9 中所述features post,

The one big limitation today is that the properties have to be mutable for object initializers to work: They function by first calling the object’s constructor (the default, parameterless one in this case) and then assigning to the property setters.

但是,具有只读修饰符的值类型是不可变的,如 readonly documentation 中所述。

因此,无法将只读属性与对象初始值设定项一起使用。

但是,对于 Init-only 属性,您可以使用对象初始化器。

Init-only 属性的目的是允许仅在对象初始值设定项或 class 的构造函数中进行赋值。

如果我们考虑您的 Person class,在构造函数或对象初始值设定项中允许分配给 FirstNameLastName,但您不能分配给其他地方FirstNameLastName

public class Person
{
    public string FirstName { get; init; }
    public string LastName { get; init; }

    // this is a constructor
    public Person()
    {
        this.FirstName = "first name"; // works
        this.LastName = "last name"; // works
    }
}

//this is a random method
public SomeMethod()
{
    Person myPerson = new Person
    {
        FirstName = "first name", // works
        LastName = "last name" // works
    };

    myPerson.FirstName = "change the first name"; // Error (CS8852)
    myPerson.LastName = "change the last name"; // Error (CS8852)
}

与设置不同,init-only 属性 只能在构造函数中设置或使用 属性 初始化程序设置。