【发布时间】:2020-11-09 09:49:55
【问题描述】:
我一直在阅读 C#9 中的 init-only 属性,但我认为我们已经有了只能在构造函数中设置的只读属性。之后,它是不可变的。
例如,在此处的类中,Name 和 Description 都可以在构造函数中赋值,但只能在构造函数中赋值,这正是对 init-only 属性的描述。
示例类
class Thingy {
public Thingy(string name, string description){
Name = name;
Description = description;
}
public string Name { get; }
public string Description { get; }
public override string ToString()
=> $"{Name}: {Description}";
}
测试程序
using System;
class Program {
public static void Main (string[] args) {
var thingy = new Thingy("Test", "This is a test object");
Console.WriteLine(thingy);
// thingy.Name = “Illegal”; <— Won’t compile this line
}
}
这会输出以下内容:
Test: This is a test object
另外,如果我在构造函数运行后尝试修改Name 或Description,它将无法编译。
那么我错过了什么?
【问题讨论】:
-
由于我对此只有观察性的了解,因此我将避免发布答案,毫无疑问,有人会过来发布一个好的答案,但是就这样吧。
init访问器与set访问器相同,只是编译器会阻止您在“允许的上下文”之外使用它,它来自构造函数、对象初始化器或新的with关键字。这也意味着反射将能够使用它设置值,因此例如反序列化将起作用。 -
不同之处在于
init-only 属性也可以在对象初始化器中使用,这意味着不再需要编写大量构造器来初始化所有可能的组合(这是其中之一)当今重要的不可变类型的主要痛苦)。 -
@LasseV.Karlsen 嗯,你是
-
这可能会有所帮助Init-Only(对象初始化器)
-
伙计……下面有很多很好的答案。很难选择哪一个是例外答案。
标签: c# readonly c#-9.0 init-only