Когда использовать Array () вместо Generic.Lists в .NET

когда уместно использовать массив над универсальным списком (из T) в .NET

Я изо всех сил пытался увидеть какие-либо преимущества, которые дает массив по сравнению с общим списком, но чувствую, что мне что-то не хватает. Производительность - это то, что мне показалось одним из потенциальных узких мест?

Спасибо

Любое снижение производительности, вероятно, будет совершенно незначительным.

Mike Dunlavey 05.01.2009 18:50
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
6
1
2 191
5

Ответы 5

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

Теперь я беззастенчиво скопирую свой отредактированный ответ для очень похожий вопрос задан здесь сегодня:

I would like to point it out that while arrays have covariance, generic lists do not. For example, an array of type MyChildClass[] can be easily casted to MyParentClass[], while List<MyChildClass> cannot be casted to List<MyParentClass>, at least not directly.

If you need covariance, either use arrays, use LINQ's Cast() method or some other means to cast each item individually.

или дождитесь C# 4, у которого будет ковариация ;-)

JoshBerke 05.01.2009 17:14

Джош: Как отметил Марк Гравелл в комментарии к моему первоначальному ответу: «C# 4 не будет предлагать ковариацию для списков - только IEnumerable <T> (и несколько делегатов) - он требует строгого использования" in "xor" out ", и List <T> имеет как "вход", "а также", так и "использование".

Tamas Czinege 05.01.2009 17:21

Интересно, что не знал этого. Одна проблема с Arrays as Covariance заключается в том, что если MyParentClass [] установлен в MyChildClass [], если вы затем попытаетесь поместить класс MySecondChild в MyParentClass, вы получите исключение. Не очень интуитивно понятно.

JoshBerke 05.01.2009 18:24

Подробнее о ковариации массива: blogs.msdn.com/ericlippert/archive/2007/10/17/…

JoshBerke 05.01.2009 18:24

Еще одна причина использовать обычные массивы - это когда вы работаете с вызовом платформы (выполняете неуправляемый код c / C++), но это ограничено очень небольшим набором приложений.

Также в качестве примечания: если размер массива известен, но вы все равно хотите использовать общий список, не забудьте передать размер в параметр емкости конструктора.

Например:

List<int> lst = new List<int> (100);

В противном случае список будет начинаться с очень маленькой емкости, и несколько раз потребуется выделить новые фрагменты памяти, а не сразу выделить необходимое пространство.

Многие структуры данных более высокого уровня (включая List) используют массивы внутри, это единственный способ сохранить необработанную последовательность в памяти - поэтому массив должен существовать на языке программирования, иначе у вас не было бы структур данных более высокого уровня.

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

Единственное исключение (на мой взгляд) - это редкий случай, когда вам нужна коллекция известного фиксированного размера в качестве локальной переменной, чем использование чего-то еще кажется расточительным.

Если вы хотите кэшировать фиксированное количество данных, используйте массивы. В противном случае используйте общие списки ... они просто проще в использовании, обеспечивают большую гибкость и набираются (нет необходимости в упаковке / распаковке) ... просто. Кроме того, массив имеет фиксированную длину, а списки могут быть переменными и изменяться в любое время. Причины могут быть бесконечными, почему использовать общий список вместо массива. Массивы - это просто заноза в заднице. И, честно говоря, снижение производительности при использовании списка по сравнению с массивом, вероятно, может быть предметом споров до энной степени.

Другие вопросы по теме