1

索引器是否应该始终引用离散序列?我很想不知道,但我想问问其他人是怎么想的。

这个问题是在对多项式类进行“捷径”之后开始的。

Polynomial p = new Polynomial(coefficients);

计算 y = p(5.2) 的正常方法是使用以下方法调用:

double y = p.Evaluate(5.2);

制作的快捷方式(使用 double 类型的索引器)是:

double y = p[5.2];

我认为这个想法是多项式(一个连续函数)被视为一种模拟数组或连续数组,如果这有意义的话。但是,Evaluate 函数来自接口 IMathFunction。该接口也用于插值类:

CubicSplineInterpolator f = new CubicSplineInterpolator(arrayOfPoints)

这里有一个问题,因为插值器类已经有一个 int 类型的公共索引器来访问它们用于插值的点数组。插值器可以像一个连续函数一样工作(在其限制范围内),但如果将快捷方式推广到所有 IMathFunction 类,则 f[5.0] 和 f[5] 将返回不同的对象,并且在阅读代码时可能会造成混淆。

double y;
Point<double> p;

// ... some other code

CubicSplineInterpolator f = new CubicSplineInterpolator(arrayOfPoints)
y = f[5.0];
p = f[5];

我应该担心这种使用 double 类型的索引器还是应该使用它们?

4

2 回答 2

3

根据微软的索引属性设计指南,“索引属性允许像数组一样访问项目组。” 因此,意图显然是让索引器来自离散集合。此外:

避免使用 System.Int32、System.Int64、System.String、System.Object、枚举或泛型类型参数以外的参数类型的索引器。

如果设计需要其他类型的参数,您应该强烈地重新评估该成员是否真的代表对逻辑集合的访问。如果不是,请改用方法并考虑选择以 Get 或 Set 开头的方法名称。

在纯粹的数学术语中,函数被定义为映射,可能在像实数这样的无限集合上,.NET 语言使用方法来表示这种映射。这就是你应该遵循的模式。

请注意,委托是这种情况的一种特殊情况,其中该Invoke方法被视为默认方法。这使您可以编写myDelegate(arg1)而不是myDelegate.Invoke(arg1). 不过,这是一个特例。默认方法在 C# 或 VB 中不可用。

也许最好将索引器视为下标。毕竟,在数学中,像向量或序列这样的集合元素通常由带有下标的集合名称来表示。您很少看到 f x表示函数 f 在值 x 处的值。

于 2011-11-11T02:20:57.913 回答
2

您使用索引器所做的通常是通过方法来完成的……尽管您可以将索引器当作方法来使用,但这不是它的预期语义,因此它可能会使大多数阅读您的代码的人感到困惑。所以我建议反对它:保留索引器以直接访问集合中的特定项目,或用于具有类似目的的操作。

于 2011-11-11T01:21:04.637 回答