Звичайно, вам потрібні масиви для управління вашою колекцією змінних конструкцій, і що б ми без них зробили.
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
(зауважте, що можуть бути випадки, коли масив змінної структури бажаний, але зазвичай така різнича поведінка змінних структур у масивах порівняно з іншими колекціями є джерелом помилок, яких слід уникати)
Більш серйозно, вам потрібен масив, якщо ви хочете передати елемент за посиланням . тобто
Interlocked.Increment(ref myArray[i]); // works
Interlocked.Increment(ref myList[i]); // does not work, you can't pass a property by reference
Це може бути корисно для безпечного коду, що захищений від потоку.
Вам потрібен масив, якщо ви швидко та ефективно хочете ініціалізувати свою колекцію фіксованого розміру зі значенням за замовчуванням .
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
(зауважте, що можна було б реалізувати конструктор для List, який робить те саме, це просто те, що c # не пропонує цю функцію)
вам потрібен масив, якщо ви хочете ефективно копіювати частини колекції
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
(знову ж, це може бути реалізовано і для List, але ця функція не існує в c #)
List<T>