2010-04-29 2 views
7

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

+0

См. Также http://stackoverflow.com/questions/2535516/how-are-delegates-in-c-better-than-function-pointers-in-cc и http://www.codeproject.com/kb /cpp/FastDelegate.aspx. Автор статьи во второй ссылке рассматривает объектно-ориентированные указатели функций делегатов. –

+0

Связанный (и интересный текст): http://stackoverflow.com/questions/7932215/could-the-clr-support-a-function-pointer-value-type – Shog9

ответ

15

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

Делегаты также имеют встроенные асинхронных интерфейсов, и имеют совместное/противопоказания дисперсии при назначении новых функций делегата (и, в .NET 4, при прохождении вокруг делегатов)

+0

hmm, последовательные процедуры. есть ли проблемы с несколькими потоками, добавляемыми к данному делегату, чтобы порядок выполнения не был согласован? – yamspog

+0

Делегаты неизменяемы. Объединение одного с другим (что и делает, когда вы добавляете метод) возвращает новый объект Delegate и оставляет нетронутыми оригиналы. Таким образом, они по своей сути являются потокобезопасными. – thecoop

2

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

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

4

Не в классическом смысле C/C++, нет. Но концепция несколько похожа: .NET вводит концепцию delegates для обработки ситуаций, когда вам нужна переменная для вызова метода. Делегаты не могут быть «спрятаны» с помощью указателей и есть встроенная система безопасности.

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

16

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

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

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

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

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

Смежные вопросы