c# - 索引器是否应该始终引用离散序列?

标签 c# indexer

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

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

Polynomial p = new Polynomial(coefficients);

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

double y = p.Evaluate(5.2);

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

double y = p[5.2];

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

CubicSplineInterpolator f = new CubicSplineInterpolator(arrayOfPoints)

这里有一个问题,因为插值器类已经有一个 int 类型的公共(public)索引器来访问它们用于插值的点数组。插值器可以像一个连续函数(在其限制内)一样工作,但如果将快捷方式推广到所有 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 类型的索引器还是应该使用它们?

最佳答案

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

Avoid indexers with parameter types other than System.Int32, System.Int64, System.String, System.Object, enumerations, or generic type parameters.

If the design requires other types of parameters, you should strongly reevaluate whether the member really represents access to a logical collection. If not, use methods instead and consider choosing a method name that begins with Get or Set.

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

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

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

关于c# - 索引器是否应该始终引用离散序列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8088368/

相关文章:

c# - 如何在 C# UWP 中暂停一个线程,同时继续其他线程

C# 字符串值未完全显示在 VS Code 监 window 口中

c# - 如何在修改其副本时保持通用列表不变?

android - 如何在 ListView 的特定位置添加分隔符?

c++ - 如何调整 Eclipse 的 C++ 索引器?

c# - 从 Active Directory 检索用户名

c# - 将月差添加到新日期

c# - 索引器 - 显式接口(interface)成员实现

c# - 使用数组的 SetValue 方法与 [] 索引器

azure - 认知搜索索引器包括所有文件,无论包含列表如何