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





Когда вы используете фиксированное количество объектов данного типа, нет смысла снижать производительность, связанную с классом 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 toMyParentClass[], whileList<MyChildClass>cannot be casted toList<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, у которого будет ковариация ;-)
Джош: Как отметил Марк Гравелл в комментарии к моему первоначальному ответу: «C# 4 не будет предлагать ковариацию для списков - только IEnumerable <T> (и несколько делегатов) - он требует строгого использования" in "xor" out ", и List <T> имеет как "вход", "а также", так и "использование".
Интересно, что не знал этого. Одна проблема с Arrays as Covariance заключается в том, что если MyParentClass [] установлен в MyChildClass [], если вы затем попытаетесь поместить класс MySecondChild в MyParentClass, вы получите исключение. Не очень интуитивно понятно.
Подробнее о ковариации массива: blogs.msdn.com/ericlippert/archive/2007/10/17/…
Еще одна причина использовать обычные массивы - это когда вы работаете с вызовом платформы (выполняете неуправляемый код c / C++), но это ограничено очень небольшим набором приложений.
Также в качестве примечания: если размер массива известен, но вы все равно хотите использовать общий список, не забудьте передать размер в параметр емкости конструктора.
Например:
List<int> lst = new List<int> (100);
В противном случае список будет начинаться с очень маленькой емкости, и несколько раз потребуется выделить новые фрагменты памяти, а не сразу выделить необходимое пространство.
Многие структуры данных более высокого уровня (включая List) используют массивы внутри, это единственный способ сохранить необработанную последовательность в памяти - поэтому массив должен существовать на языке программирования, иначе у вас не было бы структур данных более высокого уровня.
Мое мнение таково, что если вам не нужно (например, потому что вы используете компонент, который требует этого), вы никогда не должны использовать массивы - особенно не пишите код, который возвращает массивы, принимайте массивы в качестве параметров, поэтому вы не заставляете других тоже используйте массивы.
Единственное исключение (на мой взгляд) - это редкий случай, когда вам нужна коллекция известного фиксированного размера в качестве локальной переменной, чем использование чего-то еще кажется расточительным.
Если вы хотите кэшировать фиксированное количество данных, используйте массивы. В противном случае используйте общие списки ... они просто проще в использовании, обеспечивают большую гибкость и набираются (нет необходимости в упаковке / распаковке) ... просто. Кроме того, массив имеет фиксированную длину, а списки могут быть переменными и изменяться в любое время. Причины могут быть бесконечными, почему использовать общий список вместо массива. Массивы - это просто заноза в заднице. И, честно говоря, снижение производительности при использовании списка по сравнению с массивом, вероятно, может быть предметом споров до энной степени.
Любое снижение производительности, вероятно, будет совершенно незначительным.