Чому масиви в .Net мають довжину, але інші типи колекцій мають кількість? [зачинено]


23

Наприклад, у C # масиви мають властивість Length. Але інші типи колекцій, такі як списки тощо, мають властивість Count. Чи є причина, чому ці дві різні? Якщо так, я хотів би знати.


4
Я не можу знайти свій свисток
Ліпперта

4
Просто дике здогадка, оскільки я не маю внутрішніх знань про те, як було створено CLR: деталі того, як працюють масиви, були визначені перед типами колекції. Виклик властивості Length - найприродніша назва для нього, а оскільки не існував стандарт, який би існував, тому дизайнер масивів вирішив використовувати. Потім колекції були вказані згодом, але довжина не підходить для деяких колекцій (це передбачає лінійність, тому для не упорядкованих колекцій це не розумне ім'я), тому граф був обраний як більш логічно послідовний.
Жуль

4
Я здогадуюсь, що цей колишній пост stackoverflow має правильну відповідь.
Док Браун

6
@MetaFight: Нещодавно я записав серію навчальних відео, і в один момент я згадую, що не маю поняття, чому дизайнери використовували і довжину, і кількість. Це завжди вражало мене як химерне. Коментар Жуля вище здається правдоподібним.
Ерік Ліпперт

3
Мета зауваження - я подав 5-й VTC, оскільки я не вірю на це питання можна остаточно відповісти. Існуюча відповідь є твердою та правдоподібною відповіддю, але вона не підкріплена доказами. Так само коментар Ліпперта спонукає мене думати, що ніхто не знає відповіді, оскільки це могло бути пов’язане з недоглядом на відміну від свідомого рішення.

Відповіді:


30

Їх називають по-різному, оскільки семантично вони зовсім інші:

Кількість колекції - це кількість предметів, які зараз зберігаються в ній і можуть з часом змінюватися.

Довжина масиву - це максимальна кількість елементів, які він може вмістити (він матиме довжину 10, навіть якщо ви не зберегли в ньому стільки елементів) і є незмінним.

Приклад:

Якщо у мене є відро, яке може вмістити максимум 100 кульок, воно має довжину 100. Якщо я вкладу в нього 50 кульок, то воно має кількість 50.

Якщо я додаю ще 10 куль, то граф стає 60, але довжина все ще 100. Для зміни довжини мені потрібно отримати відро.

Масив, ймовірно, використовує слово "Довжина", оскільки під капотом він виділяє суміжний блок (довжину) пам'яті на основі ємності, помноженої на розмір елемента. Хоча той факт, що клас List використовує "Ємність" для аналогічної (хоча й мінливої) концепції, говорить про масив, може використовувати слово "Довжина" з історичних причин.


12
A T[]з довжиною N завжди зберігає точно N значень типу T. Семантично не всі ці значення можуть бути змістовними (вони можуть бути, nullнаприклад), але вони існують. Це відрізняється від звичайного значення ємності (як використовується, List<T>наприклад). Ти маєш рацію, що Countможе змінюватися, а Lengthне можеш. Потім знову нічого мандату, що Countнасправді зміниться. Він також використовується для незмінних колекцій.

@delnan о дорогий. не усвідомлював, що слово Capacity вже вживалося в C #, як це. Я випадково її перевантажив. Дякуємо, що вказали на це. Я уточню свою відповідь, щоб уточнити.
комбінаторика

Різниця між місткістю і довжиною є - ємність може змінюватися протягом життєвого циклу об'єкта, тоді як Довжина завжди залишається однаковою. Якщо я бачу властивість Length на об'єкті, я вважаю, що це "жорстке" максимальне число (або межа / індекс), тоді як якщо я бачу властивість Capacity, я вважаю, що це "soft" максимальне число, яке я повинен лише перевірити проти, якщо я переймаюся продуктивністю.
StupidOne

@StupidOne: Якщо ви йдете цим маршрутом, то будь-який масив також повинен мати count-property.
Дедуплікатор

1
Чорт StringBuilder ... на таких суворіших мовах, як Vigil, клас StringBuilder був би належним чином покараний за порушення конвенції github.com/muvable/vigil
Falco
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.