В большинстве случаев все было довольно просто:
Код: Выделить всё
Collection a = [5, 2];
IEnumerable b = [5, 2];
IReadOnlyList c = [5, 2];
Код: Выделить всё
Collection a = new Collection { 5, 2 };
IEnumerable b = new z__ReadOnlyArray(new int[2] { 5, 2 });
IReadOnlyList c = new z__ReadOnlyArray(new int[2] { 5, 2 });
Код: Выделить всё
ICollection d = [5, 2];
Код: Выделить всё
List list = new List();
CollectionsMarshal.SetCount(list, 2);
Span span = CollectionsMarshal.AsSpan(list);
int num = 0;
span[num] = 5;
num++;
span[num] = 2;
num++;
ICollection d = list;
Грубый и абсолютно ненаучный тест двух подходов показывает следующие результаты при построении коллекции 100 000 000 раз:
Количество элементов в массиве
Длительность с IEnumerable
Длительность с ICollection
2
1,0 с.
1,5 с.
25
7,4 с.
4,1 с.
32
7,4 с.
5,0 с.
Похоже, что оба подхода сопоставимы по производительности: первый лучше, когда есть представляет собой небольшое количество элементов, тогда как второй превосходит его, когда количество элементов начинает увеличиваться.
Однако компилятор, похоже, выбирает подход, основанный на типе, а не на на ряде фактических значений в коллекции.
Каковы могут быть причины вообще использовать этот второй подход, учитывая, что сгенерированный компилятором тип z__ReadOnlyArray`1' все равно реализует ICollection?
Подробнее здесь: https://stackoverflow.com/questions/790 ... ion-syntax
Мобильная версия