有一种简单的方法可以使实例不可变吗?
让我们举个例子,我有一个包含大量数据字段的类(只有数据,没有行为):
class MyObject
{
// lots of fields painful to initialize all at once
// so we make fields mutable :
public String Title { get; set; }
public String Author { get; set; }
// ...
}
Run Code Online (Sandbox Code Playgroud)
创建示例:
MyObject CreationExample(String someParameters)
{
var obj = new MyObject
{
Title = "foo"
// lots of fields initialization
};
// even more fields initialization
obj.Author = "bar";
return obj;
}
Run Code Online (Sandbox Code Playgroud)
但是现在我已经完全创建了我的对象,我不希望该对象再次变得可变(因为数据使用者永远不需要改变状态),所以我想要像List.AsReadOnly这样的东西:
var immutableObj = obj.AsReadOnly();
Run Code Online (Sandbox Code Playgroud)
但是如果我想要这种行为,我需要创建另一个具有完全相同字段但没有setter的类.
那么有没有自动生成这个不可变类的方法呢?或者在创建过程中允许可变性的另一种方法,但是一旦初始化就不可变?
我知道字段可以标记为"只读",但是对象将在类之外初始化,并且将所有字段作为构造函数参数传递似乎是一个坏主意(参数太多).