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

viv*_*una 1 c# c#-9.0

我正在浏览即将发布的C# 9 新功能Init-Only属性正在被引入。

今天的一大限制是属性必须是可变的,对象初始值设定项才能工作:它们通过首先调用对象的构造函数(在本例中为默认的无参数构造函数)然后分配给属性设置器来起作用。

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

public class Person
{
    public string FirstName { get; init; }
    public string LastName { get; init; }
}
Run Code Online (Sandbox Code Playgroud)

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

nal*_*lka 15

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

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

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)
}
Run Code Online (Sandbox Code Playgroud)


emr*_*azi 9

正如新的 C# 9特性帖子中所述,

今天的一大限制是属性必须是可变的,对象初始值设定项才能工作:它们通过首先调用对象的构造函数(在本例中为默认的无参数构造函数)然后分配给属性设置器来起作用。

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

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

但是,对于 Init-only 属性,您可以使用对象初始值设定项。