2013-09-03 31 views
6

Zaten C# (C++ 'daki işaretçileri kullanarak dinamik dizi hakkında bildiğim) hakkında generikleri ve dizileri biliyorum, ayrıca dizilerin sabit boyutta olduğunu biliyorum, bu yüzden Başlatma'dan sonra boyutunu değiştiremeyiz, yeni bir tane ayırmak zorundayız. sonra .net meclislerinin kaynak kodunu görmek için ILspy kullanıyorum, Son zamanlarda ......<T> listesi, dahili olarak diziyi (sabit olan) kullanmasına rağmen nasıl dinamik olarak çalışır?

kopyalayıp i Liste dahili özel dizinin itimat bulundu ama o iş nasıl çözemedim Bu yüzden, anladığımda, teknik olarak ne zaman büyüdüğümü veya bellekte yeniden boyutlandırılacağını merak ettim.

+1

Bkz. Http://www.jetbrains.com/decompiler/ –

cevap

22

List<T>, bir boyuttan T[] dizisini ayırır ve dizi dolduruluncaya kadar öğeleri için depo olarak kullanır. Bundan sonra yeni bir öğenin eklenmesi gerektiğinde, liste yeni, daha büyük bir dizi ayırır ve tüm öğeleri eski diziden yenisine kopyalar. Yeni öğe daha sonra sorunsuz eklenebilir. Bir List öğeleri eklenerek, bu davranış sonucunda

, olarak tarif edilen bir amortized O (1) çalışma: destek dizisinde boş alan olmadığı için en ekler sabit zaman alacak, ancak bazı ekler tetikler bir dizi yeniden tahsis ve çok daha fazla zaman alır.

uygulanma şekli de List kamu arayüzünden belirgindir: yararlı liste boyutlandırma olmadan tutabilir ve ayrıca sağlayan bir constructor kadar ön bazı Belirtilen kapasite rezerve kaç öğe kontrol eden bir Capacity özellik (orada listenin en az belli bir boyutta olacağını önceden bildiğinizde, gereksiz yeniden boyutlandırma işlemlerinden kaçının).

İlgili konular