Здравствуйте, Ikemefula, Вы писали:
Q>>С такими библиотеками никогда не сталкивался. Если столкнулся бы с API, что не позволяет передать часть массива — сделал бы копию.
I>И для чего тогда этот кульный метод, если надо самому делать копию?
Для работы с теми API, которые таки принимают фрагмент массива (с другими я не сталкивался). Тогда делать копию не нужно.
Q>>И этот низкоуровневый API обычно принимает (start, count).
I>Это далеко не факт. Часто надо подготовить буфер определенной длины и заполнить его различными данными.
Давай примеры из BCL? Интересует пример API, котоый принимает на вход буфер, но не предоставляет перегрузку, принимающую (offset, count) или (start, length).
Q>>И как твой ресайз позволит избавиться от лишней аллокации массива при попытке получить массив из Листа?
I>Элементрно. Мне нуже буфер размера 100. Капсити — 128. Вместо создания нового экземпляра и копирования вручную, я просто сообщаю желаемый размер и фремворк обрезает массив до 100 элементов.
В моём примере не надо
ничего копировать или аллоцировать:
string[] array = list.MoveToArray();
return string.Join(", ", array, 1, 3);
Приведи аналогичный код, считая, что у тебя есть API для ресайза массива. Вот обрезал ты у листа внутренний недоступный тебе буфер. Как ты извлечёшь его для передачи в API, который принимает массив, а не лист?
I>Твой кейс не подразумевает простой передачи владения и ты сам же предлагаешь копировать вручную.
Нет. Я не предлагаю копировать вручную.
I>Просто потому что капасити будет всегда не того размера, что нужно вызываемому код. Т.е. всегда придется заниматься копированием вручную.
Нет. Копировать возможно придётся только в тех редких случаях, если API не предоставляет перегрузки с (offset, count) или (start, length). Но я с такими случаями в стандартной библиотеке не сталкивался, а ты их не приводишь.