Vous avez besoin de tableaux pour gérer votre collection de structures mutables , bien sûr, et que ferions-nous sans celles-ci.
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
(notez qu'il peut y avoir des cas où un tableau de structures mutables est souhaitable, mais généralement ce comportement différent des structures mutables dans les tableaux par rapport aux autres collections est une source d'erreurs qui doivent être évitées)
Plus sérieusement, vous avez besoin d'un tableau si vous voulez passer un élément par référence . c'est à dire
Interlocked.Increment(ref myArray[i]); // works
Interlocked.Increment(ref myList[i]); // does not work, you can't pass a property by reference
Cela peut être utile pour le code threadsafe sans verrouillage.
Vous avez besoin d'un tableau si vous souhaitez initialiser rapidement et efficacement votre collection de taille fixe avec la valeur par défaut .
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
(notez qu'il serait possible d'implémenter un constructeur pour List qui fait de même, c'est juste que c # n'offre pas cette fonctionnalité)
vous avez besoin d'un tableau si vous souhaitez copier efficacement des parties de la collection
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
(encore une fois, c'est quelque chose qui pourrait également être implémenté pour List, mais cette fonctionnalité n'existe pas en c #)
List<T>
is also just as efficient in memory and performance as an array
- euh. D'où tenez-vous cette notion?var test = new string[5,5]
;)