คุณต้องมีอาร์เรย์ในการจัดการคอลเลกชันของโครงสร้างที่ไม่แน่นอนและสิ่งที่เราจะทำโดยที่ไม่มี
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
ซึ่งมีประโยชน์สำหรับรหัส threadsafe ที่ไม่ล็อค
คุณต้องอาร์เรย์ถ้าคุณได้อย่างรวดเร็วและมีประสิทธิภาพต้องการที่จะเริ่มต้นคอลเลกชันขนาดคงที่ของคุณมีค่าเริ่มต้น
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
(โปรดทราบว่ามันเป็นไปได้ที่จะใช้ตัวสร้างสำหรับรายการที่ทำเช่นเดียวกันเป็นเพียงที่ 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
(อีกครั้งนี่คือสิ่งที่สามารถนำไปใช้กับรายการได้เช่นกัน แต่คุณลักษณะนี้ไม่มีอยู่ใน c #)
List<T>