.net IList的IndexOutOfRangeException<;T>;

.net IList的IndexOutOfRangeException<;T>;,.net,arrays,exception,.net,Arrays,Exception,我正在实现一个列表,我想知道IndexOutfrange的定义。你认为下列哪一项更好 /// <exception cref="IndexOutOfRangeException">if index is less than 0 /// or greater than <see cref="Count"/> public T this[int index] { get { return myArray[index]; } } ///如果索引小于0 ///或大于 publi

我正在实现一个列表,我想知道IndexOutfrange的定义。你认为下列哪一项更好

/// <exception cref="IndexOutOfRangeException">if index is less than 0
/// or greater than <see cref="Count"/>
public T this[int index] { get { return myArray[index]; } }
///如果索引小于0
///或大于
public T this[int index]{get{return myArray[index];}

///如果索引超出有效范围
///对于长度等于
public T this[int index]{get{return myArray[index];}

我正在考虑这样一种情况:这个类将从一种.NET语言中使用,该语言从1开始索引数组。我对这个主题了解不多,但第二个版本比第一个版本好吗?

是否可能还有一个“基本”属性,然后您可以说:

/// <exception cref="IndexOutOfRangeException">if index is less than <see cref="Base" />
///如果索引小于

如果您不能拥有基本属性,那么第二个版本更好,如果您必须小心使用基于1的数组。

稍微OT:您是否可以封装一个列表而不是数组,然后所有内容都会在清洗中消失,因为封装的列表将生成适当的异常

编辑:如果您确实需要在内部使用该数组,请先将其包装在访问器内的列表中,然后按索引进行选择。这样,从列表索引到数组索引的转换发生在组件的语言内部,而不是调用方的语言内部

可能列表索引的语义在.Net语言之间没有变化?这是组件应该遵循的,因为它实现了列表接口

再次编辑:实际上,这是一个问题吗

人们通过访问器访问您的数组,访问器是用您控制的语言编写的,因此知道数组索引从何处开始。即使您从VB.Net调用者调用(比如)C#类,访问器仍然会使用C#的数组索引思想,不是吗?

IList已经存在异常(ArgumentOutOfRangeException,而不是IndexOutOfRangeException)。如果您正在实现接口,并且没有更改记录的行为,那么为什么需要记录它?如果您要记录它,它应该与接口一致


EDIT:刚刚注意到您的实现(或者至少注意到您的实现命名的含义)。我同意@Dan的观点,你真的应该把它建立在列表而不是数组的基础上,这样实现就与接口一致了。在这种情况下,无需重新记录异常。如果您不更改底层实现,那么您应该捕获IndexAutoFrangeException并将其映射到接口记录的ArgumentOutOfRangeException。

作为一个旁白-您始终可以简单地从
集合继承作为起点。。。这提供了原始代码,同时允许您自定义内容。您可以从
列表
继承,但与
集合
不同,
列表
上没有有用的
虚拟
方法

谢谢您的建议,但是我希望通过直接使用阵列获得更好的性能。你确定需要优化吗?我忘了提到我还需要处理线程之间的一些同步。谢谢你的编辑。这看起来是个不错的主意,只是它会导致很大的性能开销。谢谢你的帮助!丹,你说得对。具有不同数组基的语言绝对没有问题,除非他还希望类的数组索引操作符的行为与调用语言的行为类似。但是我认为尝试这样做不是一个好主意;我不知道这门课。但是,我认为我需要更好地控制我的集合,因为我需要处理一些并发性问题。实际上,我正在将文档化的行为更改为更简单的行为,这使得代码更简单、更快,并且足以满足我的需要。(说实话,我从来都不相信索引器应该抛出除IndexOutOfRangeException之外的任何异常,除非是出于调试目的。)我的问题更多的是关于这种情况是否会发生。我来检查一下。我应该写“如果(索引<0)”还是“如果(索引/// <exception cref="IndexOutOfRangeException">if index is less than <see cref="Base" />