【发布时间】:2023-04-09 03:07:02
【问题描述】:
有没有一种简单的方法可以使实例不可变?
举个例子,我有一个类包含很多数据字段(只有数据,没有行为):
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; }
// ...
}
创建示例:
MyObject CreationExample(String someParameters)
{
var obj = new MyObject
{
Title = "foo"
// lots of fields initialization
};
// even more fields initialization
obj.Author = "bar";
return obj;
}
但是现在我已经完全创建了我的对象,我不希望对象再可变(因为数据消费者永远不需要更改状态),所以我想要类似 List.AsReadOnly:
var immutableObj = obj.AsReadOnly();
但如果我想要这种行为,我需要创建另一个具有完全相同字段但没有 setter 的类。
那么有没有自动生成这个不可变类的方法呢?或者另一种允许在创建期间可变但在初始化后不可变的方法?
我知道字段可以标记为“只读”,但对象将在类之外初始化,并且将所有字段作为构造函数参数传递似乎是个坏主意(参数太多)。
【问题讨论】:
-
您应该编辑您的问题以明确表示您对解决问题的解决方案感兴趣,即您有很多不想在构造函数调用中初始化的字段(对于某些原因)。在我的脑海中,我想说如果你真的想这样做,你可以使用一个可变的帮助类,它可以保存所有数据项来构造不可变类。初始化那个助手类,然后通过传入助手类的实例来构造你的不可变类。我不确定这是否是一个很好的模式。
-
搜索 Eric Lippert 的优秀系列作品“popsicle immutability”
-
@AlexeiLevenkov:我看到 Lippert 提到“Popsicle 不变性”的博客文章(这是一个很棒的想法),但我没有看到任何文章中他谈到了实现它的模式.
-
相关问题:How to freeze a popsicle in .NET (make a class immutable)。 @Alexei:+1 供参考。
-
如果一个干净的只读实现的参数太多,也许你的类需要重构?
标签: c# .net class immutability