Нет причин, по которым сборщик мусора не будет работать с небезопасным кодом.Я предполагаю, что вы говорите о указателях на закрепленные объекты, например:
int[] arr = new int[100];
unsafe
{
fixed (int* p = arr)
{
// use p
}
}
В конце блока p больше недоступен, поэтому его можно безопасно собрать.
Теперь ... это не всегда так.Вы можете передать указатель на другие функции и затем выйти из блока (на ум приходит семейство функций EnumWindows, где вы даете им указатель на структуру, а затем это можно сделать с помощью функции, в которой вы находитесь, они сами обрабатывают остальные),
Функция GC.KeepAlive
(чтение хака) используется для обработки этого случая, удерживая переменную в области видимости до тех пор, пока вы действительно с ней не покончите - это верно, она ничего не делает, кроме как обманывает GC вдумая, что вы все еще используете ссылку.