Когда использовать ArrayList по массиву [] в c#?

Общие формы копирования elision

Для технического обзора - пропустить этот ответ .

Для менее технического вида & amp; введение - пропустить этот ответ .

(Именован) Оптимизация возвращаемого значения является распространенной формой копирования. Это относится к ситуации, когда объект, возвращаемый значением из метода, имеет свою копию. Пример, приведенный в стандарте, иллюстрирует именованную оптимизацию возвращаемого значения, так как объект назван.

class Thing {
public:
  Thing();
  ~Thing();
  Thing(const Thing&);
};
Thing f() {
  Thing t;
  return t;
}
Thing t2 = f();

Оптимизация регулярного значения возвращается, когда возвращается время:

class Thing {
public:
  Thing();
  ~Thing();
  Thing(const Thing&);
};
Thing f() {
  return Thing();
}
Thing t2 = f();

Другие распространенные места, где происходит копирование, - это когда время передается по значению:

class Thing {
public:
  Thing();
  ~Thing();
  Thing(const Thing&);
};
void foo(Thing t);

foo(Thing());

или когда исключение выбрано и поймано по значению:

struct Thing{
  Thing();
  Thing(const Thing&);
};

void foo() {
  Thing c;
  throw c;
}

int main() {
  try {
    foo();
  }
  catch(Thing c) {  
  }             
}

Общие ограничения для копирования:

  • множественные точки возврата
  • условная инициализация

Большинство компиляторов коммерческого уровня поддерживают copy elision & amp; (N) RVO (в зависимости от настроек оптимизации).

35
задан Jibin Balachandran 10 September 2016 в 10:43
поделиться

9 ответов

Массивы со строгим контролем типов, и работают хорошо параметрами. Если Вы знаете длину своего набора, и это фиксируется, необходимо использовать массив.

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

то, Что Вы действительно хотите использовать, является универсальным списком как List<T>. Это имеет все преимущества Массива и ArrayLists. Это со строгим контролем типов, и это поддерживает переменную длину объектов.

61
ответ дан Bob 27 November 2019 в 06:39
поделиться

В дополнение к ответу Bob's и Frederick я хотел бы указать на него, что, в то время как массивы имеют ковариантность, универсальные списки не делают. Например, массив типа MyChildClass[] может быть легко литым к MyParentClass[], в то время как List<MyChildClass> не может быть литым к List<MyParentClass>, по крайней мере, не непосредственно.

, Если Вам нужна ковариантность, любое использование массивы, Бросок LINQ использования () метод или некоторые другие средства бросить каждый объект индивидуально или ожидать C# 4 .

14
ответ дан Tamas Czinege 27 November 2019 в 06:39
поделиться

Еще одна мысль здесь является мутацией; массив (T[]) полностью изменяем, и не может быть защищен. List<T> не обеспечивает полезных точек расширения, но вещи как Collection<T> (или много другой IList<T> реализации) позволяют Вам добавлять код, например, проверять объекты, прежде чем они будут добавлены; аналогично, Вы можете иметь только для чтения IList<T> реализации, который полезен для потокобезопасности, где неизменность желательна.

я склонен использовать массивы любой во внутренней логике метода (возможно, как локальная переменная), как params аргументы, или в нескольких высоко оптимизированных случаях, где я знаю длину объектов, и я знаю, что код выбирает not to mutate it (в качестве частного поля). Кроме этого, List<T> и т.д. имеют тенденцию быть более распространенным, как они имеют намного меньше служебный при добавлении/удалении объектов.

7
ответ дан Marc Gravell 27 November 2019 в 06:39
поделиться

Если та часть кода не является абсолютно критической по отношению к производительности, использование ArrayList прекрасно подходит.

5
ответ дан Michael Borgwardt 27 November 2019 в 06:39
поделиться

Лучше все еще, везде, где Вы используете ArrayList, используйте List<T> универсальный набор вместо этого. Это более со строгим контролем типов, чем первый.

4
ответ дан Frederick The Fool 27 November 2019 в 06:39
поделиться

Я отвечаю на это с точки зрения Java, но это - тот же важный вопрос. Вы не должны чувствовать себя виновными с помощью более высоких абстракций. В конце концов, Вы используете String с вместо char[], или даже byte[]? Я даже предложил бы пойти один шаг вперед и использовать эти List интерфейс, если это возможно. Единственная причина пойти один шаг вниз по причинам производительности.

Используя более высокую абстракцию набора имеет много преимуществ. Можно добавить декораторов, чтобы войти в Список, только для чтения, сделать его фиксированным размером, проверить объекты, которые вводят или оставляют набор или используют представления (см. GetRange в C# и subList в Java.)

Между прочим, ArrayList должен всегда быть основан на примитивном массиве, иначе имя является неправильным. Операции обычно реализуются, как Вы ожидали бы при использовании примитивного массива. Если связанный список используется, он обычно называл просто это - LinkedList. Это - также преимущество использования интерфейса: можно передумать об используемой реализации позже.

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

Для примитивных значений можно также рассмотреть использование примитивной библиотеки набора, например Находка GNU . Не знайте, существует ли что-либо подобное для C#, все же.

1
ответ дан Ronald Blaschke 27 November 2019 в 06:39
поделиться
1
ответ дан doekman 27 November 2019 в 06:39
поделиться

Хорошо для одного, если Вы только намереваетесь обработать определенный тип, Вы не должны использовать ArrayList. Например, если Вы только ожидаете массив байтов, необходимо только принять массив байтов.

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

0
ответ дан Spodi 27 November 2019 в 06:39
поделиться

Размер массива статичен, поэтому если Вы действительно знаете размер во время проектирования, используйте массив. Это, как предполагается, работает быстрее, но я не протестировал его сам. Если необходимо изменить количество объектов часто (добавление, или удаление объектов от набора) используют ArrayList или лучше универсальный Список от.NET 2. Также легче использовать, поэтому если производительность не крайне важна, можно всегда использовать Список.

0
ответ дан Bob 27 November 2019 в 06:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: