假设我们有以下简单的类。请注意,唯一的字段是readonly
并且用于ImmutableList<int>
:
class Abc
{
readonly ImmutableList<int> elts;
public Abc(params int[] ls) => elts = ImmutableList.CreateRange(ls);
}
给定所示的构造函数,很容易从一些int
s 创建一个实例:
var result_a = new Abc(10, 20, 30);
现在,我可能还想要一个可以构建Abc
给定 an的构造函数IEnumerable<int>
:
public Abc(IEnumerable<int> ls) => elts = ImmutableList.CreateRange(ls);
所以我们的类现在看起来像这样:
class Abc
{
readonly ImmutableList<int> elts;
public Abc(params int[] ls) => elts = ImmutableList.CreateRange(ls);
public Abc(IEnumerable<int> ls) => elts = ImmutableList.CreateRange(ls);
}
这确实有效:
var ls = new[] { 10, 20, 30 };
var result_b = new Abc(ls);
但是,这个构造函数有点尴尬,因为乍一看,是这样的:
new Abc(item)
可能看起来像是在Abc
用单个元素 ( item
) 创建一个。但是如果item
实际上是一个IEnumerable<int>
具有多个项目的,上面的第二个构造函数将被调用。
如果您查看 Microsoft ImmutableList
API,它们实际上调用ImmutableList.CreateRange
了类似于上面的第二个构造函数的静态方法。这很好,因为我们避免了上述视觉模糊。
好的,让我们开始为我们的Abc
类绘制一个类似构造函数的简单实现:
public static Abc CreateRange(IEnumerable<int> ls)
{
elts = ImmutableList.CreateRange(ls);
...
}
当然,我们在这里遇到了一个问题,因为该elts
字段是readonly
并且不能通过这个静态方法初始化:
CreateRange
那么,为我们的课程实现的好方法是Abc
什么?