2013-06-21 3 views
2

Я работаю над улучшением платформ в своей компании и во время своих исследований, я столкнулся с множеством комментариев от людей, говорящих, что следует избегать ArrayLists. Тем не менее, они никогда не давали много объяснений, почему и я не могу найти статей о том, почему они так ужасны.Что плохого в ArrayLists?

+0

Потому что они не являются универсальными в C#. http://en.csharp-online.net/CSharp_Generics_Recipes%E2%80%94Replacing_the_ArrayList_with_Its_Generic_Counterpart –

+0

Также вы не можете использовать его в Silverlight – Dilshod

+1

http://stackoverflow.com/questions/2309694/arraylist-vs-list-in- c-sharp – PeskyGnat

ответ

3

«Arraylists» (также иногда называемые «векторами») - это прекрасные структуры данных; просто ArrayList - это класс, которого следует избегать в C#.

Причина в том, что он не является общим, поэтому вы можете хранить в нем любые object, нарушая безопасность.
Используйте вместо этого List<T>.

+0

Это хорошее объяснение и ответ, но немного дальше ясность в том, что ArrayList позволит вам одновременно хранить несколько типов объектов в одном массиве ArrayList. Это означает, что вы можете хранить строки, int, object и т. Д. Все в одном массиве ArrayList, поэтому вам нужно иметь дело с тем, чтобы сохранить сохраненный тип данных перед хранением или проверить тип на выходе. В любом случае это больше подходит программисту. Дженерики просто легче, потому что они автоматически набирают безопасность. –

+0

Что делать, если вы хотите, чтобы несколько типов объектов находились в одном списке? Вы пишете игру «Астероиды» и хотите сохранить все астероиды, пули, космические корабли и т. Д. В одном списке GameObjects? Предположительно, arraylist будет в порядке, и вы можете запускать операции, перейдя через ArrayList и делая if (ArrayList [i] Is SomeInterface) ...? – NibblyPig

+0

SLC все равно будет лучше. Либо сохраните его как List GameObjects, либо создайте структуру класса, которая обеспечивает общий тип. См. Мой комментарий выше, чтобы избежать необходимости ручного управления безопасностью типа. –

2

Потому что они не сильно типизированы. Это сумка, в которой можно хранить что угодно. Это означает, что вам нужно отбрасывать при извлечении элементов. Это также означает, что может быть или не быть бокс/unboxing, участвующих в хранении и извлечения значений.

+0

Да, я понимаю. Как насчет влияния на производительность? Как производительность HashSet сравнивается с ArrayList? – user2460328

+0

Зависит от того, что вы с ним делаете. Бокс и распаковка много дорого. –

+0

@ user2460328 Вы не должны сравнивать их вообще. «Список» точно такой же, как «ArrayList», но лучше. Если вам нужна структура на основе списка, вы используете «Список». Вопрос о том, следует ли использовать «HashSet» или «Список» (который является действительным) полностью отделен от этого обсуждения и основан на типе данных, которые у вас есть и как вы планируете использовать его. – Servy

1

Они не являются общими. A List - это точно то же самое, но оно общее. Это означает, что вы обеспечиваете, чтобы все объекты были общего типа, и это ограничение выполняется компилятором. Он также избегает бокса типов значений.

0

Это не так страшно, как больно. Подумайте о них как о List, вроде, ish.

Таким образом, вы должны добавить много правил для обеспечения согласованности в коллекции и использовать их «везде» или иметь дело с ошибками, которые являются результатом не имея согласованности, «везде»

Так что многие дополнительные кода, или вы сильно скрестите пальцы и надеетесь, что программист «тупика» никогда не ставит что-то там, с которым вы не можете справиться.

Если ваша коллекция может состоять из чего угодно, то придерживайтесь ее, хотя лично я бы сказал, что если бы это произошло, то почти наверняка был какой-то главный недостаток дизайна.

Смежные вопросы