Neden Net'teki dizilerde Uzunluk var ancak diğer toplama türlerinde Sayı var? [kapalı]


23

Örneğin C # 'da, diziler Length özelliğine sahiptir. Ancak, listeler vb. Gibi diğer koleksiyon türleri Count özelliğine sahiptir. Bu ikisinin farklı olmasının bir nedeni var mı? Eğer öyleyse bilmek istiyorum.


4
Lippert
düdüğümü

4
CLR'nin nasıl tasarlandığına dair hiçbir bilgim olmadığı için, sadece tahmininin nasıl işlediğine dair detaylar toplama türlerinden önce belirtildi. Özellik çağırma Uzunluk bunun için en doğal addır ve uygun bir standart olmadığı için dizilerin tasarımcısının kullanmayı tercih ettiği şey budur. Daha sonra koleksiyonlar daha sonra belirtildi, ancak Uzunluk bazı koleksiyonlar için uygun değil (doğrusallığı ifade ediyor, bu nedenle sıralanmamış koleksiyonlar için makul bir isim değil), bu yüzden Kont daha mantıklı tutarlı olarak seçildi.
Jules

4
Sanırım bu eski stackoverflow yazısının doğru cevabı var.
Doktor Brown

6
@MetaFight: Geçenlerde bir dizi eğitim videosu kaydettim ve bir noktada tasarımcıların neden hem uzunluğu hem de sayısını kullandığı hakkında hiçbir fikrim olmadığını söyledim. Beni hep tuhaf hissettirdi. Jules'un yukarıdaki yorumu makul görünüyor.
Eric Lippert

3
Meta not - Bu sorunun kesin olarak cevaplanabileceğine inanmadığım için 5. VTC'yi yayınladım. Mevcut cevap sağlam ve makul bir cevaptır, ancak kanıtlarla desteklenmez. Aynı şekilde, Lippert'in yorumu da, kimsenin cevabı, bilinçli bir kararın aksine bir gözetimden kaynaklanabileceğini bilmediğini düşünmeye yöneltiyor.

Yanıtlar:


30

Farklı adlandırılırlar çünkü anlamsal olarak oldukça farklıdırlar:

Bir koleksiyonun Sayısı, içinde o anda depolanan öğelerin sayısıdır ve zaman içinde potansiyel olarak değişebilir.

Bir dizinin Uzunluğu, sahip olabileceği maksimum öğe sayısıdır (içinde o kadar fazla öğe saklamamış olsanız bile 10 uzunluğa sahip olacak) ve değişmez.

Örnek:

İçinde maksimum 100 top sığabilecek bir kepçem varsa, uzunluğu 100'dür. Eğer içine 50 top koyarsam, sayısı 50'dir.

10 top daha eklersem Sayı 60 olur ama Uzunluk hala 100'dür. Uzunluğu değiştirmek için farklı bir kovaya ihtiyacım var.

Dizi, muhtemelen Kelime kelimesini kullanır, çünkü başlık altında, öğe boyutuyla çarpılan kapasiteye bağlı olarak bitişik bir bellek bloğu (uzunluk) tahsis eder. Her ne kadar List sınıfının benzer (değişebilir olsa da) bir kavram için "Kapasite" kullandığı gerçeği, dizinin "Uzunluk" kelimesini tarihsel nedenlerle kullanabileceğini ileri sürüyor.


12
T[]N uzunluğa sahip A , her zaman tam olarak N türündeki değerleri kaydeder T. Anlamsal olarak, bu değerlerin tümü anlamlı olmayabilir ( nullörneğin olabilirler ), ama varlar. Bu, kapasitenin normal anlamından farklıdır ( List<T>örneğin, örneğin). Olmasa Countda değişebilecek olan haklısın Length. Sonra tekrar, hiçbir şey Countdeğişmeyecek, aslında değişecek. Değişmez koleksiyonlar için de kullanılır.

@delnan oh canım. Capacity kelimesini C # 'da zaten böyle kullandığının farkında değildim. Yanlışlıkla aşırı yükledim. Bunu gösterdiğin için teşekkürler. Netleştirmek için cevabımı güncelleyeceğim.
kombinatorik

Kapasite ve Uzunluk arasındaki fark - Kapasite nesnenin kullanım ömrü boyunca değişebilir, Uzunluk ise daima aynı kalır. Nesnede bir Length özelliği görürsem, "zor" maksimum sayı (veya kenarlık / dizin) olduğunu varsayarım, Capacity özelliğini görürsem, yalnızca kontrol etmem gereken "yumuşak" maksimum sayı olduğunu varsayardım performansla ilgileniyorsam karşı.
StupidOne

@StupidOne: Eğer o rotada giderseniz, herhangi bir dizide de bir count-property olmalıdır .
Deduplicator

1
Lanet StringBuilder ... daha katı Vigil gibi dillerde StringBuilder sınıfı, kuralları çiğnemek
Falco
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.