在下面的一段代码(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];
}
答案 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];