Выбор ответа Senior GC, IDisposable и производительность обновлено

ArrayPool и аренда буферов

Вопрос

Что важно помнить при работе с ArrayPool<byte>.Shared.Rent(1000)?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Массив может быть длиннее 1000, его надо вернуть, и в нём старые данные. Rent отдаёт массив из пула подходящего размера, часто больше запрошенного, поэтому работать надо с нужной длиной, а не с array.Length.

Варианты ответа

  1. Массив может быть длиннее 1000, его надо вернуть, и в нём старые данныеправильный ответ
  2. Вернётся массив ровно из 1000 байт, заполненный нулями при аренде
  3. Возвращать массив не нужно: пул сам заметит, что он не используется
  4. Массив из пула нельзя передавать в другие методы, только читать на месте

Разбор

Rent отдаёт массив из пула подходящего размера, часто больше запрошенного, поэтому работать надо с нужной длиной, а не с array.Length. Массив не очищается: там могут быть данные прошлого арендатора (для секретов вызывают Return(array, clearArray: true)). Без Return пул просто не получит массив обратно, и выгода пропадёт. Использовать массив после Return нельзя, это ошибка «use after free» на управляемом уровне.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.