Почему ICollection обрабатывается по-разному в синтаксисе выражений коллекции?C#

Место общения программистов C#
Ответить
Anonymous
 Почему ICollection обрабатывается по-разному в синтаксисе выражений коллекции?

Сообщение Anonymous »

Я проверял (просто из любопытства), как синтаксис выражений коллекции, представленный в C# 12, транслируется в IL-код и, в частности, какие именно типы данных используются под капотом.
В большинстве случаев все было довольно просто:

Код: Выделить всё

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;
В режиме выпуска единственное, что меняется, — это удаление переменной d — переменная list используется непосредственно там, где d использовалась в исходный код.
Грубый и абсолютно ненаучный тест двух подходов показывает следующие результаты при построении коллекции 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»