2011-08-26 64 views
17

Sự khác nhau giữa hai phương thức này là gì và khi nào bạn sử dụng một phương pháp thay vì phương pháp kia?Sự khác biệt giữa mảng.GetLength (0) và mảng.GetUpperBound (0)

int[,] array = new int[4,3]; 
int length0 = array.GetLength(0); 
int upperbound0 = array.GetUpperBound(0); 

MSDN nói rằng getLength trả lại số yếu tố nơi như GetUpperBound xác định chỉ số tối đa, nhưng làm thế nào điều này có thể khác nhau kể từ khi mảng được khởi tạo với các yếu tố đối với từng chỉ số?

+4

Bạn cho rằng giới hạn dưới luôn là số không. Không phải vậy. –

Trả lời

31

Hãy xem phương pháp này (ít được sử dụng). Từ MSDN:

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

Tạo một mảng đa chiều của Type và kích thước của chiều dài quy định, với sự giới hạn thấp hơn quy định.

Với nó, bạn có thể tạo một mảng với chỉ mục từ -5 ... +5. Nếu bạn sử dụng loại mảng này, thì GetUpperBound() đột nhiên trở nên hữu ích hơn rất nhiều so với GetLength()-1. Cũng có một số GetLowerBound().

Nhưng hỗ trợ C# cho loại mảng này thấp, bạn chỉ cần những phương thức đó kết hợp với phương thức Array.GetValue()/SetValue().

+1

"nhưng xin đừng làm vậy". Tại sao không, nếu bạn chắc chắn về ranh giới mảng của bạn? – Epiplon

+2

Tôi sẽ chỉ sử dụng khi tôi _không chắc chắn về ranh giới. –

7

Array.Length trả về độ dài của mảng (số phần tử), bạn cần để trừ 1 từ đó để lấy UpperBound.

Array.GetUpperBound(0) trả về giới hạn trên của mảng, bạn có thể sử dụng nó như hiện tại.

2

GetUpperBound trả về chỉ mục cao nhất trong mảng, số GetLength trả về số phần tử của mảng.

tức là GetUpperBound = GetLength - 1

+3

Thông thường. Nhưng đó không phải là lý do tại sao nó được cung cấp. –

+0

+1 cho câu trả lời của bạn, không biết rằng bạn có thể bắt đầu một mảng tại một chỉ mục khác 0! –

1

Nói chung, array.GetUpperBound(0) = array.Length - 1, nhưng vì chúng tôi có thể tạo mảng có giới hạn dưới Nonzero, điều đó không phải lúc nào cũng đúng.

0

nếu giới hạn dưới của mảng là 0 thì bạn có thể sử dụng một trong hai mảng đó mà không có bất kỳ sự nhầm lẫn nào nhưng tôi khuyên bạn nên array.length-1 vì nó được sử dụng rộng rãi. tuy nhiên, nếu giới hạn dưới của mảng của bạn nhỏ hơn 0 thì bạn nên sử dụng array.GetUpperBound (0) vì trong trường hợp này array.length-1! = array.getUpperBound (0)

Các vấn đề liên quan