Mengapa array di .Net memiliki Panjang tetapi jenis koleksi lainnya memiliki Hitungan? [Tutup]

23

Dalam C # misalnya, array memiliki properti Panjang. Tetapi jenis koleksi lain seperti daftar, dll. Memiliki properti Count. Apakah ada alasan mengapa keduanya berbeda? Jika demikian saya ingin tahu.

Arunster
sumber
4
Saya tidak dapat menemukan peluit Lippert saya, jadi saya tidak berpikir kami akan mendapatkan jawaban yang baik hari ini :(
MetaFight
4
Hanya tebakan liar, karena saya tidak memiliki pengetahuan orang dalam tentang bagaimana CLR dirancang: rincian cara kerja array ditentukan sebelum jenis pengumpulan. Memanggil properti Panjang adalah nama yang paling alami untuk itu, dan karena tidak ada standar yang sudah ada untuk menyesuaikan, jadi inilah yang dipilih oleh perancang array. Kemudian koleksi ditentukan setelahnya, tetapi Panjang tidak sesuai untuk beberapa koleksi (itu menyiratkan linearitas, jadi untuk koleksi yang tidak terurut bukan nama yang masuk akal) sehingga Count dipilih sebagai lebih konsisten secara logis.
Jules
4
Saya kira posting stackoverflow ini memiliki jawaban yang tepat.
Doc Brown
6
@MetaFight: Saya baru-baru ini merekam serangkaian video pendidikan dan pada satu titik saya menyebutkan bahwa saya tidak tahu mengapa para desainer menggunakan panjang dan jumlah. Saya selalu merasa aneh. Komentar dari Jules di atas tampaknya masuk akal.
Eric Lippert
3
Meta note - Saya telah menggunakan VTC ke-5 karena saya tidak yakin pertanyaan ini dapat dijawab secara pasti. Jawaban yang ada adalah jawaban yang solid dan masuk akal, tetapi tidak didukung dengan bukti. Demikian juga, komentar Lippert membuat saya berpikir bahwa tidak ada yang tahu jawabannya karena itu mungkin karena kekhilafan yang bertentangan dengan keputusan sadar.

Jawaban:

30

Mereka diberi nama berbeda karena secara semantik mereka sangat berbeda:

Hitungan koleksi adalah jumlah item yang saat ini disimpan di dalamnya dan berpotensi berubah seiring waktu.

Panjang array adalah jumlah maksimum item yang dapat dipegang (itu akan memiliki panjang 10 bahkan jika Anda belum menyimpan banyak item di dalamnya) dan tidak dapat diubah.

Contoh:

Jika saya memiliki ember yang dapat memuat maksimal 100 bola di dalamnya, ia memiliki Panjang 100. Jika saya memasukkan 50 bola ke dalamnya, ia memiliki Hitungan 50.

Jika saya menambahkan 10 bola lagi Hitungan menjadi 60 tetapi Panjangnya masih 100. Untuk mengubah Panjang saya perlu mendapatkan ember yang berbeda.

Array mungkin menggunakan panjang kata karena di bawah kap itu mengalokasikan blok yang berdekatan (panjang) memori berdasarkan kapasitas dikalikan dengan ukuran item. Meskipun fakta bahwa kelas Daftar menggunakan "Kapasitas" untuk konsep yang serupa (meskipun bisa berubah) menyarankan array dapat menggunakan kata "Panjang" untuk alasan historis.

kombinatorik
sumber
12
A T[]dengan panjang N selalu menyimpan nilai tipe N persis T. Semantik, tidak semua nilai-nilai itu mungkin bermakna (mereka mungkin nullmisalnya), tetapi mereka ada. Ini berbeda dari arti biasa kapasitas (seperti yang digunakan List<T>misalnya). Anda benar yang Countbisa berubah sementara Lengthtidak bisa. Dan lagi, tidak ada mandat yang Countakan, pada kenyataannya, berubah. Ini juga digunakan untuk koleksi abadi.
@nannan oh sayang. tidak menyadari kata Kapasitas sudah digunakan dalam C # seperti ini. Saya tidak sengaja membebani itu. Terima kasih telah menunjukkan ini. Saya akan memperbarui jawaban saya untuk menjelaskan.
kombinatorik
Perbedaan antara Kapasitas dan Panjang adalah - Kapasitas dapat berubah sepanjang siklus hidup objek, sementara Panjang selalu tetap sama. Jika saya melihat properti Panjang pada objek, saya akan menganggap itu nomor maksimum "keras" (atau perbatasan / indeks), sedangkan jika saya melihat properti Kapasitas, saya akan menganggap itu nomor maksimum "lunak" yang hanya harus saya periksa menentang jika saya khawatir dengan kinerja.
StupidOne
@StupidOne: Jika Anda pergi rute itu, maka array apa pun juga harus memiliki count-properti.
Deduplicator
1
Sialan StringBuilder ... dalam bahasa yang lebih ketat seperti Vigil, kelas StringBuilder akan dihukum dengan benar karena melanggar konvensi github.com/munificent/vigil
Falco