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,在构造函数或对象初始值设定项中允许分配给 FirstName
或 LastName
,但您不能分配给其他地方FirstName
或LastName
:
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 属性 只能在构造函数中设置或使用 属性 初始化程序设置。
我正在查看 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,在构造函数或对象初始值设定项中允许分配给 FirstName
或 LastName
,但您不能分配给其他地方FirstName
或LastName
:
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 属性 只能在构造函数中设置或使用 属性 初始化程序设置。