我正在实现一个列表,我想知道IndexOutOfRange的定义。您认为以下哪一项更好?
/// <exception cref="IndexOutOfRangeException">if index is less than 0
/// or greater than <see cref="Count"/>
public T this[int index] { get { return myArray[index]; } }
或者
/// <exception cref="IndexOutOfRangeException">if index outside the valid range
/// for an array of length equal to <see cref="Count"/></exception>
public T this[int index] { get { return myArray[index]; } }
我正在考虑这个类是从.NET语言开始使用的情况,该语言从1开始索引数组。我对这个主题知之甚少,但是第二个版本比第一个版本更好吗?
答案 0 :(得分:1)
稍微OT:你可以封装一个列表而不是一个数组,然后一切都在清洗中掉线,因为封装列表会产生适当的异常吗?
编辑:如果你真的需要内部数据,那么将它包装在访问者首先的列表中,然后按索引选择。这样,从列表索引到数组索引的转换发生在您的组件的语言内,而不是调用者的语言中。
据推测,列表索引的语义在.Net语言中不会发生变化吗?这是您的组件应该遵循的,因为它实现了列表界面。
再次编辑:实际上,这是一个问题吗?
人们通过访问器访问您的阵列,访问器使用您控制的语言编写,因此知道数组索引的起始位置。即使你从VB.Net调用者调用你的(说)C#类,访问器仍然会使用C#的数组索引的想法,不是吗?
答案 1 :(得分:0)
你是否有可能拥有“基础”属性,然后你可以说:
/// <exception cref="IndexOutOfRangeException">if index is less than <see cref="Base" />
如果您不能拥有Base属性,那么第二个版本更好,如果您必须小心基于1的数组。
答案 2 :(得分:0)
的IList&LT; T&GT;已经documents异常(ArgumentOutOfRangeException,而不是IndexOutOfRangeException)。如果您正在实现界面而不是更改记录的行为,为什么还需要记录它?如果你要记录它,它应该同意接口。
编辑:刚刚注意到您的实施(或至少通过命名您的实施来暗示)。我同意@Dan,你真的应该基于List&lt; T&gt;而不是数组,以便实现与接口一致。在这种情况下,无需重新记录异常。如果您不更改底层实现,那么您应该捕获IndexOutOfRangeException并将其映射到接口记录的ArgumentOutOfRangeException。
答案 3 :(得分:0)
顺便说一下 - 你总是可以简单地从Collection<T>
继承作为起点......这提供了原始代码,同时让你自定义东西。您可以继承List<T>
,但与Collection<T>
不同,virtual
上没有有用的List<T>
方法。