Natürlich benötigen Sie Arrays, um Ihre Sammlung veränderlicher Strukturen zu verwalten , und was würden wir ohne diese tun ?
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
(Beachten Sie, dass es einige Fälle geben kann, in denen ein Array mit veränderlichen Strukturen wünschenswert ist. In der Regel ist dieses unterschiedliche Verhalten von veränderlichen Strukturen in Arrays im Vergleich zu anderen Auflistungen jedoch eine Fehlerquelle, die vermieden werden sollte.)
Im Ernst, Sie benötigen ein Array, wenn Sie ein Element als Referenz übergeben möchten . dh
Interlocked.Increment(ref myArray[i]); // works
Interlocked.Increment(ref myList[i]); // does not work, you can't pass a property by reference
Dies kann für sperrenfreien Thread-Safe-Code hilfreich sein.
Sie benötigen ein Array, wenn Sie Ihre Sammlung mit fester Größe schnell und effizient mit dem Standardwert initialisieren möchten .
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
(Beachten Sie, dass es möglich wäre, einen Konstruktor für List zu implementieren, der dasselbe tut. Es ist nur so, dass c # diese Funktion nicht bietet.)
Sie benötigen ein Array, um Teile der Sammlung effizient zu kopieren
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
(Auch dies ist etwas, das für List ebenfalls implementiert werden könnte, aber diese Funktion ist in c # nicht vorhanden.)
List<T>