.NET veri yapıları:
ArrayList ve List'in neden gerçekten farklı olduğu hakkında daha fazla bilgi
Diziler
Bir kullanıcının belirttiği gibi, Diziler "eski okul" koleksiyonudur (evet, diziler bir parçası olmasa da bir koleksiyon olarak kabul edilir System.Collections). Ancak, diğer koleksiyonlara kıyasla dizilerle ilgili "eski okul" nedir, yani başlığınızda listeledikleriniz (burada, ArrayList ve List (Of T))? Dizilere bakarak temel bilgilerle başlayalım.
Başlamak için, Microsoft .NET'teki Diziler "birkaç mantıksal ilişkili öğeyi tek bir koleksiyon olarak ele almanızı sağlayan mekanizmalardır" (bağlantılı makaleye bakın). Bu ne anlama geliyor? Diziler, ayrı ayrı üyeleri (elemanları) bir başlangıç adresiyle birbiri ardına bellekte depolar. Diziyi kullanarak, o adresten başlayarak sıralı olarak saklanan öğelere kolayca erişebiliriz.
Bunun ötesinde ve 101 ortak anlayışı programlamanın aksine, Diziler gerçekten oldukça karmaşık olabilir:
Diziler tek boyutlu, çok boyutlu veya yorgun olabilir (pürüzlü diziler okunmaya değer). Dizilerin kendisi dinamik değildir: bir kez başlatıldığında, n boyutundaki bir dizi n sayıda nesneyi tutmak için yeterli alan ayırır . Dizideki öğelerin sayısı büyüyemez veya küçülemez. Dim _array As Int32() = New Int32(100)dizinin bellek bloğunda 100 Int32 ilkel tür nesnesi içermesi için yeterli alan ayırır (bu durumda, dizi 0'ları içerecek şekilde başlatılır). Bu bloğun adresi adresine geri döner _array.
Makaleye göre, Ortak Dil Belirtimi (CLS) tüm dizilerin sıfır temelli olmasını gerektirir. .NET'teki diziler sıfır tabanlı olmayan dizileri destekler; ancak, bu daha az yaygındır. Sıfır tabanlı dizilerin "yaygınlığı" sonucunda Microsoft, performanslarını optimize etmek için çok zaman ; bu nedenle, tek boyutlu, sıfır tabanlı (SZ'ler) diziler "özel" dir - ve gerçekten de bir dizinin en iyi uygulamasıdır (çok boyutlu vb. aksine) - çünkü SZ'lerin onları işlemek için belirli ara dil talimatları vardır.
Diziler her zaman referans olarak geçirilir (bir bellek adresi olarak) - bilinmesi gereken Array bulmacasının önemli bir parçası. Sınır denetimi yaparken (bir hata verir), sınır denetimi de dizilerde devre dışı bırakılabilir.
Yine, dizilerin önündeki en büyük engel yeniden boyutlandırılmamalarıdır. "Sabit" kapasiteye sahiptirler. ArrayList ve List'in (Of T) tarihimize tanıtılması:
ArrayList - genel olmayan liste
ArrayList (birlikte List(Of T)- bazı kritik farklılıklar vardır gerçi, burada, daha sonra anlatılacak) - belki (geniş anlamda) koleksiyonlarının yanında ek olarak en iyi düşüncedir. ArrayList, IList ('ICollection' ın soyundan) arayüzünden miras alır . ArrayLists, kendileri Listelerden daha hantaldır - daha fazla ek yük gerektirirler .
IListuygulamanın ArrayLists'e sabit boyutlu listeler (Arrays gibi) gibi davranmasını sağlar; ancak, ArrayLists tarafından eklenen ek işlevsellik ötesinde, bu durumda ArrayLists (Diziler üzerinde) olarak sabit boyutlu ArrayLists kullanmanın belirgin şekilde daha yavaş olmasının gerçek bir avantajı yoktur.
Okuduğumdan, ArrayLists tırtıklı olamaz: "Çok boyutlu dizileri eleman olarak kullanmak ... desteklenmiyor". Yine, ArrayLists tabutundaki başka bir çivi. Dizi Listeleri da "Yazılan" değildir - yani altına her şey, bir ArrayList nesneleri dinamik Dizisi basitçe: Object[]. Bu, ArrayLists'i uygularken, yine ek yüklerine ekleyerek çok fazla boks (örtük) ve unboxing (açık) gerektirir.
Asılsız düşünce: Sanırım profesörlerimden birini okuduğumu veya duyduğumu, ArrayList'lerin Dizilerden Liste tipi Koleksiyonlara geçme girişiminin piç kavramsal çocuğu olduğunu hatırlıyorum, yani bir kez Diziler için büyük bir gelişme olurken, koleksiyonlarla ilgili daha fazla geliştirme yapıldığı için artık en iyi seçenek değiller
Liste (Of T): ArrayList'in ne olduğu (ve olmasını umduğu)
Bellek kullanımındaki fark, bir Listenin (Int32) aynı ilkel tür içeren bir ArrayList'ten% 56 daha az bellek tükettiği kadar önemlidir (yukarıdaki beyefendinin bağlantılı gösterisinde 8 MB'ye karşı 19 MB: yine buraya bağlanmıştır ) - yine de bu 64-bit makine tarafından birleştirilen bir sonuçtur. Bu fark gerçekten iki şeyi gösterir: birincisi (1), kutulu bir Int32 tipi "nesne" (ArrayList) saf bir Int32 ilkel tipinden (Liste) çok daha büyüktür; ikincisi (2), 64-bitlik bir makinenin iç işleyişinin bir sonucu olarak fark üsteldir.
Peki, fark nedir ve bir liste nedir (Of T) ? MSDN , bir List(Of T)", dizin tarafından erişilebilen, güçlü bir şekilde yazılmış nesnelerin listesini" olarak tanımlar . Burada önemli olan "kuvvetle yazılan" bittir: bir List (Of T) 'tipleri' tanır 've nesneleri kendi tipleri olarak saklar. Yani, an bir tür Int32olarak Int32değil , bir olarak depolanır Object. Bu, boks ve kutudan çıkarmanın neden olduğu sorunları ortadan kaldırır.
MSDN, bu farkın yalnızca ilkel türleri saklarken ve referans türlerini saklarken devreye girdiğini belirtir. Çok, fark gerçekten büyük ölçekte gerçekleşir: 500'den fazla eleman. Daha da ilginç olanı, MSDN belgelerinin "ArrayList sınıfını kullanmak yerine List (Of T) sınıfının türe özgü uygulamasını kullanmanızdır."
Esasen, List (Of T) ArrayList'tir, ancak daha iyidir. ArrayList'in "genel eşdeğeridir". ArrayList gibi, sıralanana kadar sıralanması garanti edilmez (şekil). List (Of T) 'nin bazı ek işlevleri de vardır.