Выбор ответа Senior GC, IDisposable и производительность обновлено
ArrayPool и аренда буферов
Вопрос
Что важно помнить при работе с ArrayPool<byte>.Shared.Rent(1000)?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Массив может быть длиннее 1000, его надо вернуть, и в нём старые данные. Rent отдаёт массив из пула подходящего размера, часто больше запрошенного, поэтому работать надо с нужной длиной, а не с array.Length.
Варианты ответа
- Массив может быть длиннее 1000, его надо вернуть, и в нём старые данныеправильный ответ
- Вернётся массив ровно из 1000 байт, заполненный нулями при аренде
- Возвращать массив не нужно: пул сам заметит, что он не используется
- Массив из пула нельзя передавать в другие методы, только читать на месте
Разбор
Rent отдаёт массив из пула подходящего размера, часто больше запрошенного, поэтому работать надо с нужной длиной, а не с array.Length. Массив не очищается: там могут быть данные прошлого арендатора (для секретов вызывают Return(array, clearArray: true)). Без Return пул просто не получит массив обратно, и выгода пропадёт. Использовать массив после Return нельзя, это ошибка «use after free» на управляемом уровне.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.