Как уже говорили другие, вы захотите использовать делегаты для ситуаций в C #, для которых вы использовали бы указатели функций в C ++. Делегаты концептуально похожи на указатели функций, но гораздо более приятны в использовании, поскольку они инкапсулируют не только функцию, но и «принимающий» объект, который будет «этим» вызова.
Обратите внимание, что в CLR есть концепция указателей на функции. Если бы вы внимательно посмотрели на то, как компилятор C # генерирует код, который создает делегаты, вы бы увидели, что он создает управляемую ссылку на функцию и передает ее конструктору делегата. В C # нет языковой функции, которая позволяла бы получить указатель на «голую» функцию и манипулировать им напрямую.
Однако, поскольку концепция существует в CLR, теоретически возможно, что будущая версия C # будет поддерживать указатели функций как первоклассную концепцию в небезопасном коде, так же как мы поддерживаем указатели данных в небезопасном коде. В этом случае мы будем (1) отслеживать сигнатуру указателя функции в качестве типа указателя и (2) генерировать код, который использует код операции CIL «calli» (обращение через указатель).
Это повысило бы эффективность в некоторых непонятных сценариях взаимодействия, где сегодня в основном вы должны заставить маршаллинговый код перепрыгивать через много циклов, создавая экземпляры делегатов исключительно для того, чтобы маршаллер мог получить указатель функции, хранящийся в них. Если бы мы могли избежать затрат на конструирование делегата и перейти прямо к указателю на функцию, то такие редко встречающиеся сценарии взаимодействия могут стать менее дорогостоящими.
Однако я бы не задержал дыхание в ожидании этой функции на твоем месте. Мы создали его прототип, и он работает достаточно хорошо, но я не думаю, что сейчас есть необходимость в его добавлении в язык общего назначения, такой как C #.