Tất nhiên, bạn cần các mảng để quản lý bộ sưu tập các cấu trúc có thể thay đổi và chúng ta sẽ làm gì nếu không có chúng.
struct EvilMutableStruct { public double X; } // don't do this
EvilMutableStruct[] myArray = new EvilMutableStruct[1];
myArray[0] = new EvilMutableStruct()
myArray[0].X = 1; // works, this modifies the original struct
List<EvilMutableStruct> myList = new List<EvilMutableStruct>();
myList.Add(new EvilMutableStruct());
myList[0].X = 1; // does not work, the List will return a *copy* of the struct
(lưu ý rằng có thể có một số trường hợp trong đó một mảng cấu trúc có thể thay đổi là mong muốn, nhưng thông thường hành vi khác nhau này của các cấu trúc có thể thay đổi trong các mảng so với các bộ sưu tập khác là một nguồn lỗi nên tránh)
Nghiêm trọng hơn, bạn cần một mảng nếu bạn muốn truyền một phần tử bằng cách tham chiếu . I E
Interlocked.Increment(ref myArray[i]); // works
Interlocked.Increment(ref myList[i]); // does not work, you can't pass a property by reference
Điều đó có thể hữu ích cho mã chủ đề không khóa.
Bạn cần một mảng nếu bạn muốn nhanh chóng và hiệu quả để khởi tạo bộ sưu tập kích thước cố định của mình với giá trị mặc định .
double[] myArray = new double[1000]; // contains 1000 '0' values
// without further initialisation
List<double> myList = new List<double>(1000) // internally contains 1000 '0' values,
// since List uses an array as backing storage,
// but you cannot access those
for (int i =0; i<1000; i++) myList.Add(0); // slow and inelegant
(lưu ý rằng có thể triển khai một hàm tạo cho Danh sách giống như vậy, chỉ là c # không cung cấp tính năng này)
bạn cần một mảng nếu bạn muốn sao chép một cách hiệu quả các phần của bộ sưu tập
Array.Copy(array1, index1, array2, index2, length) // can't get any faster than this
double[,] array2d = new double[10,100];
double[] arraySerialized = new double[10*100];
Array.Copy(array2d, 0, arraySerialized, 0, arraySerialized.Length);
// even works for different dimensions
(một lần nữa, đây cũng là điều có thể được triển khai cho Danh sách, nhưng tính năng này không tồn tại trong c #)
List<T>