【问题标题】:IndexOutOfRangeException for an IList<T>IList<T> 的 IndexOutOfRangeException
【发布时间】:2010-09-27 20:26:32
【问题描述】:

我正在实现一个列表,我想知道 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 开始索引数组。我对此主题了解不多,但是第二个版本比第一个更好吗?

【问题讨论】:

    标签: .net arrays exception


    【解决方案1】:

    有点OT:你能不能封装一个列表而不是一个数组,然后所有的东西都掉出来了,因为封装的列表会产生适当的异常?

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

    大概列表索引的语义不会在 .Net 语言中发生变化?这是你的组件应该遵循的,因为它实现了列表接口。

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

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

    【讨论】:

    • 感谢您的建议,但我希望通过直接使用数组来获得更好的性能。
    • 您确定还需要优化吗?
    • 我忘了说我还需要处理线程之间的一些同步。
    • 感谢您的编辑。这看起来是个好主意,只是它会导致很大的性能开销。不过感谢您的帮助!
    • 丹,你是对的。具有不同数组基数的语言绝对没有问题,除非他还希望他的类的数组索引运算符表现得像调用语言的那样。但我认为尝试这样做不是一个好主意。
    【解决方案2】:

    是否有可能你也可以有一个“Base”属性,那么你可以说:

    /// <exception cref="IndexOutOfRangeException">if index is less than <see cref="Base" />
    

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

    【讨论】:

      【解决方案3】:

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

      编辑:刚刚注意到您的实现(或者至少是您的实现命名的含义)。我同意@Dan,您真的应该将它基于 List 而不是数组,以便实现与接口一致。在这种情况下,无需重新记录异常。如果您不更改底层实现,那么您应该捕获 IndexOutOfRangeException 并将其映射到接口记录的 ArgumentOutOfRangeException。

      【讨论】:

      • 我实际上正在将记录的行为更改为更简单的行为,这使代码更简单、更快,并且足以满足我的需求。 (说实话,我从不相信索引器应该抛出 IndexOutOfRangeException 以外的任何异常,除非是出于调试目的。)
      • 我的问题更多是关于这种情况是否会发生。考虑我会做一个检查。我应该写“if (index
      【解决方案4】:

      顺便说一句-您总是可以简单地从Collection&lt;T&gt; 继承作为起点...这提供了原始代码,同时让您可以自定义事物。您可以从 List&lt;T&gt; 继承,但与 Collection&lt;T&gt; 不同的是,List&lt;T&gt; 上没有有用的 virtual 方法。

      【讨论】:

      • 感谢您的建议;我不知道这门课。但是,我认为我需要更好地控制我的集合,因为我需要处理一些并发问题。
      猜你喜欢
      • 2017-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-02
      • 1970-01-01
      • 1970-01-01
      • 2012-05-28
      相关资源
      最近更新 更多