Функция UnsafeAccessor, появившаяся в .NET 8, позволяет обращаться к приватным полям и методам без использования классической рефлексии. Замеры показывают, что чтение приватного поля через UnsafeAccessor занимает 0,25 наносекунды, тогда как рефлексия требует 8,96 наносекунды и выделяет 24 байта в куче. При использовании UnsafeAccessor выделение памяти равно нулю.
Разрыв в производительности между рефлексией и UnsafeAccessor варьируется в зависимости от версии .NET и оборудования. В .NET 10 рефлексию ускорили, сократив отставание, но она остается медленнее. UnsafeAccessor работает за счет поиска поля при компиляции метода, подставляя машинный код, идентичный прямому обращению к полю.
При вызове методов через рефлексию возникают дополнительные расходы на создание массивов аргументов и упаковку значений, что увеличивает объем выделяемой памяти. UnsafeAccessor требует точного совпадения сигнатуры метода с исходной; в противном случае при первом вызове возникнет исключение MissingMethodException.
В .NET 10 добавлен атрибут UnsafeAccessorType, позволяющий указывать тип строкой без необходимости прямой ссылки на сборку. Этот механизм уже применяется в библиотеке классов .NET, например, для работы с BinaryFormatter или GenericPrincipal, когда тип заранее неизвестен или отсутствует в зависимостях.






