C# 只读属性集代码在多个构造函数中重复

C# 只读属性集代码在多个构造函数中重复,c#,constructor,immutability,readonly,readonly-collection,C#,Constructor,Immutability,Readonly,Readonly Collection,我有一个DataStructure类,我希望它是不可变的 通常,我只需确保我的所有成员都定义为只读-任务完成。 但是其中一个成员是一个列表(INT),因此我需要确保不能修改列表;因此,我将其更改为一个只读集合。好的 我还需要以某种方式对该集合进行排序—同样很好,在通过.AsReadOnly()转换列表之前,我会对列表进行相应的排序 到目前为止,一切都很好 但最后一步是我需要3个不同的构造函数——每个构造函数接受不同格式的原始数据。 现在我必须在每个构造函数中复制将列表转换为必要格式的代码 如果我

我有一个
DataStructure
类,我希望它是不可变的

通常,我只需确保我的所有成员都定义为
只读
-任务完成。 但是其中一个成员是一个列表(INT),因此我需要确保不能修改
列表
;因此,我将其更改为一个
只读集合
。好的

我还需要以某种方式对该集合进行排序—同样很好,在通过
.AsReadOnly()
转换列表之前,我会对列表进行相应的排序

到目前为止,一切都很好

但最后一步是我需要3个不同的构造函数——每个构造函数接受不同格式的原始数据。 现在我必须在每个构造函数中复制将列表转换为必要格式的代码

如果我将其公共化为
setList()
方法,那么变量不能是
只读的,因为它是在非构造函数方法中赋值的。现在我失去了一些不变性

理想情况下,我可以通过某种方式声明
setList
方法只能从构造函数调用,因此允许编辑
readonly
成员,但我认为这并不存在

我可以创建用getter等包装一切的类,这样类从外部是不可变的,但我更希望它从内部也是不可变的(特别是考虑到我可以做到这一点,我牺牲了干燥)


有人对我忘记的语言特性有什么聪明的想法可以解决这个问题吗?

您可以将它作为一个普通的列表保存在类中,但只能将其作为只读公开给外部(只需在属性中返回
.AsReadOnly()

尽管如果您确实想要内部不变性,构造函数可以相互调用:

public Foo( int a ) { ... }
public Foo( string a ) : this( int.Parse( a ) ) { ... }
因此,您可以将大部分代码放在一个构造函数中(如果需要,甚至可以放在私有构造函数中),并在其他构造函数中完成转换。编辑:用这种方式做很多工作有点困难,所以我仍然认为应该将转换转移到方法中。如果该方法不访问任何类成员,它在内部仍然是不可变的

我个人喜欢的另一种模式(即使只是语法上的不同)是:


与使用构造函数调用的
void SetList(List)
不同,您可以使用
List PrepareList(List)
。此方法将准备列表,并将其返回给调用者,即构造函数


因此,代码不会重复-除了每个构造函数中的矫揉造作的
\u list=PrepareList(list)

将成员标记为readonly并不会使集合不可变…是的,我考虑了将构造函数链接在一起的选项,但主体比简单的int.Parse()复杂得多列表并不是我从输入中提取的唯一成员。我想我可以定义一系列方法来提取vrious列表和其他东西,但总体上感觉有点难看。使用类似于静态“构造函数”的方法,然后遵从真正的构造函数来设置只读成员是一个不错的设计。如果没有任何其他解决方案,我会使用它。然后我会说使用静态方法,它会给你更多的工作空间!啊,太好了!正是我想要的。
private Foo( int a ) { ... }

public static Foo FromBar( Bar b )
{
    int x;
    // convert from Bar here
    return new Foo( x );
}

public static Foo FromSomethingElse( SomeThingElse b )
{
    int x;
    // convert from SomeThingElse here
    return new Foo( x );
}