есть ли в c# указатели функции?

Я пытаюсь изучить некоторое кодирование c# и удивление, если понятие C++ указателей функции включено в c#. Я вижу, что существуют такие вещи как делегаты. Действительно ли они - то же понятие? или они отличаются на более фундаментальном уровне?

8
задан yamspog 29 April 2010 в 16:04
поделиться

4 ответа

Делегаты по сути являются указателями на функции, но со встроенными дополнительными возможностями многоадресной рассылки. Таким образом, вы можете назначить несколько функций одному и тому же делегату, и все они будут вызываться в последовательность вызова делегата.

У делегатов также есть встроенные асинхронные интерфейсы, и у них есть вариативность co / contra при назначении новых функций делегату (и, в .NET 4, при передаче делегатов)

16
ответ дан 5 December 2019 в 04:46
поделиться

Не в классическом смысле C / C ++, нет. Но концепция в чем-то похожа - .NET вводит концепцию делегатов для обработки ситуаций, когда вам нужна переменная для вызова метода. С делегатами нельзя "вертеться", как с указателями, и есть встроенная система безопасности типов.

Если вы "правильно" используете указатели функций в стиле C, концепции аналогичны. Но, похоже, существует много устаревшего кода, который выполняет забавные манипуляции с указателями, чтобы обойти безопасность типов или что-то еще.

4
ответ дан 5 December 2019 в 04:46
поделиться

Как говорили другие, вы захотите использовать делегаты для ситуаций в C #, для которых вы использовали бы указатели на функции в C ++. Делегаты концептуально похожи на указатели на функции, но их гораздо удобнее использовать, поскольку они инкапсулируют не только функцию, но и «принимающий» объект, который будет «this» вызова.

Обратите внимание, что в CLR есть концепция указателей на функции. Если бы вы внимательно посмотрели на то, как компилятор C # генерирует код, который создает делегатов, вы бы увидели, что он создает управляемую ссылку на функцию и передает ее конструктору делегата.В C # нет языковой функции, которая позволяет вам получить "голый" указатель на функцию и напрямую управлять им.

Однако, поскольку эта концепция действительно существует в CLR, теоретически возможно, что будущая версия C # могла бы поддерживать указатели функций как первоклассную концепцию в небезопасном коде, точно так же, как мы поддерживаем указатели данных в небезопасном коде. В этом случае мы должны (1) отслеживать сигнатуру указателя функции как тип указателя и (2) выдавать код, который использует "calli" (вызов через косвенный указатель) код операции CIL.

Это повысило бы эффективность в некоторых малоизвестных сценариях взаимодействия, где сегодня в основном вам приходится заставлять код маршаллинга перепрыгивать через множество обручей, создавая экземпляры делегатов исключительно для того, чтобы маршаллер мог получить доступ к хранящемуся в них указателю на функцию. Если бы мы могли избежать затрат на создание делегата и перейти прямо к указателю на функцию, тогда эти редкие сейчас сценарии взаимодействия могли бы стать менее затратными.

Однако на вашем месте я бы не стал задерживать дыхание, ожидая появления этой функции. Мы создали его прототип, и он работает достаточно хорошо, но я не думаю, что в настоящее время существует потребность в добавлении его в язык общего назначения, такой как C #.

19
ответ дан 5 December 2019 в 04:46
поделиться

Делегат в некотором роде похож на указатель на функцию, но на самом деле он ближе к интерфейсу только с одной функцией в сочетании со способом регистрации обработчиков и механизмом многоадресной рассылки.

Так что это намного больше, чем указатель на функцию.

2
ответ дан 5 December 2019 в 04:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: