从数组中获取项目(索引检查)

时间:2015-02-19 08:05:56

标签: c#

在下面的一段代码(c#cookbook)中,检查index是否大于或等于零的目的是什么?

 /// <summary>
 /// Get an item from the class
 /// </summary>
 /// <param name="index">the index of the item to get</param>
 /// <returns>an item of type object</returns>
 public object GetItem(int index)
 {
   if (index >= this.Items.Length &&
   index >= 0)
   throw new ArgumentOutOfRangeException("index");
   return this.Items[index];
 }

5 个答案:

答案 0 :(得分:0)

我认为这是代码中的错误。我想谁曾写过这个,倒了标志:))

如果index小于零,您可以使用负值索引this.Items。这是不允许的......

答案 1 :(得分:0)

唯一的目的是为高于和低于允许索引范围的值设置不同的例外。如果索引为负数,则不会抛出ArgumentOutOfRangeException,因此将在下一行抛出IndexOutOfRangeException

代码看起来不正确。如果代码检查了索引的上限和下限,那将更有意义:

if (index >= this.Items.Length || index < 0) {
  throw new ArgumentOutOfRangeException("index");
}
return this.Items[index];

答案 2 :(得分:0)

应该是

if (length <= index || index < 0)

OP发布的内容完全是胡说八道。

此外,假设长度是某种类型数组的属性,OP的帖子中最右边的表达式将始终为真,因此它是浪费KB的...

为了分享,因为表达式是从左到右评估的,所以在左边放置最明显的排除项;一旦遇到失败,将不再评估。

考虑:

bool b = false;

if (!b || a == 2)
    // a == 2 will never be evaluated.

// More useful, real-world:
if (myData != null && myData.Satisfies.SomeOtherCondition)
    // if myData is null, the program doesn't bother with the rest...

答案 3 :(得分:0)

原始代码:

if (index >= this.Items.Length && index >= 0)
    throw new ArgumentOutOfRangeException("index");

return this.Items[index];

这对我来说没有意义,因为如果你有正确的索引,你就会抛出错误。

应该是:

if (index >= this.Items.Length || index < 0)
    throw new ArgumentOutOfRangeException("index");

return this.Items[index];

这样做的目的是确保您没有为数组提供错误的索引并抛出未知错误。

但话说回来,我不会这样做。我会进一步优化它。如果索引超出范围,它将抛出一个错误,因此在底层代码之前抛出相同的错误似乎不太有利。

答案 4 :(得分:0)

从技术上讲,正确的语法是这样的:

  if ((index < Items.GetLowerBound(0)) || (index > Items.GetUpperBound(0)))
    throw new ArgumentOutOfRangeException("index");

  return this.Items[index];

因为C#中的数组不需要从零开始,所以你可以期待(至少在噩梦中)遇到像这样的怪物:

var myUglyArray = Array.CreateInstance(typeof(int), new int[] { 12 }, new int[] { 1 });

然而,这样的阵列是罕见的avises而不是符合CLS的,这就是为什么如果你的委托是CLS投诉

[assembly:CLSCompliant(true)]

您可以将检查简化为

  if ((index < 0) || (index >= Items.Length))
    throw new ArgumentOutOfRangeException("index");

  return this.Items[index];