数组.GetLength(0)和数组.GetUpperBound(0)的区别

31
这两种方法有什么区别?使用哪一种而不是另一种?
int[,] array = new int[4,3];
int length0 = array.GetLength(0);
int upperbound0 = array.GetUpperBound(0);

MSDN中指出,GetLength返回元素数量,而GetUpperBound确定最大索引。但是,由于数组已经初始化了每个索引的元素,这两者怎么可能不同呢?


8
你假设下限总是零,但事实并非如此。 - Hans Passant
6个回答

46

看一下这个(很少使用的)方法。来自 文档

public static Array CreateInstance(Type elementType, int[] lengths, int[] lowerBounds)

创建指定类型和维度长度、指定下限的多维数组。

使用它,你可以创建一个索引从 -5 ... +5 的数组。如果您曾经使用过这种类型的数组,则 GetUpperBound()GetLength()-1 更有用处。还存在一个 GetLowerBound()

但是 C# 对这种类型的数组的支持比较低,您不能使用 [] 运算符。只有与 Array.GetValue() 和 SetValue() 方法相结合时,您才需要使用这些方法。


11

Array.Length返回数组的长度(元素数量),需要从中减去1才能获得上界。

Array.GetUpperBound(0)返回数组的上界,您可以直接使用它。


3

通常情况下,array.GetUpperBound(0) = array.Length - 1,但是由于我们可以创建具有非零下限的数组,因此这并不总是正确的。


3
GetUpperBound返回数组的最高索引,而GetLength返回数组的元素数量。

也就是说,GetUpperBound = GetLength - 1


3
通常情况下是这样。但这不是提供的原因。 - H H
+1 对你的回答,不知道数组可以从索引0以外的位置开始! - George Duckett

2

我知道这是一个老问题,但我认为值得强调的是GetUpperBound返回指定维度的上边界。对于多维数组来说,这很重要,因为在这种情况下,两个函数是不等价的。

// Given a simple two dimensional array
private static readonly int[,] USHolidays =
{
    { 1, 1 },
    { 7, 4 },
    { 12, 24 },
    { 12, 25 }
};

Length属性会输出8,因为数组中有8个元素。

Console.WriteLine(USHolidays.Length);

然而,GetUpperBound()函数将输出3作为第一维度的上限边界是3。换句话说,我可以循环遍历数组索引0、1、2和3。

Console.WriteLine(USHolidays.GetUpperBound(0));
for (var i = 0; i <= USHolidays.GetUpperBound(0); i++)
{
    Console.WriteLine("{0}, {1}", USHolidays[i, 0], USHolidays[i, 1]);
}

0
如果你的数组下限是0,那么你可以使用它们中的任何一个而不会有任何混淆,但我建议使用array.length-1,因为它被广泛使用。然而,如果你的数组下限小于0,那么你应该使用array.GetUpperBound(0),因为在这种情况下,array.length-1 != array.getUpperBound(0)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接