索引器是否应始终引用离散序列?

时间:2011-11-11 00:41:40

标签: c# indexer

索引器是否应始终引用离散序列? 我很想不,但我想问别人怎么想。

问题在多项式类的'快捷方式'之后开始。

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类型的索引器或者它应该用于什么?

2 个答案:

答案 0 :(得分:3)

根据微软的indexed property design指南,“索引属性允许对项目组进行类似阵列的访问。”因此,意图显然是让索引器来自离散集。此外:

  

避免索引器的参数类型不同于System.Int32,System.Int64,System.String,System.Object,枚举或通用   类型参数。

     

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

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

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

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

答案 1 :(得分:2)

你使用索引器做的事情通常是通过一种方法来完成的......虽然可以使用索引器就好像它是一个方法,但它不是它的预期语义,所以它可能会让大多数阅读您代码的人感到困惑。所以我会建议反对它:保留索引器以直接访问集合中的特定项目,或者用于具有类似目的的操作。