Я пытаюсь изучить некоторые кодировки C# и задаюсь вопросом, включена ли в C# концепция указателей функций C++. Я вижу, что есть такие вещи, как делегаты. Это одна и та же концепция? или они отличаются на более фундаментальном уровне?Есть ли указатели функций в C#?
ответ
Делегаты - это, по сути, функциональные указатели, но с дополнительными возможностями многоадресной рассылки. Таким образом, вы можете назначить несколько функций одному и тому же делегату, и все они будут вызваны последовательно, когда вызывается делегат.
Делегаты также имеют встроенные асинхронных интерфейсов, и имеют совместное/противопоказания дисперсии при назначении новых функций делегата (и, в .NET 4, при прохождении вокруг делегатов)
hmm, последовательные процедуры. есть ли проблемы с несколькими потоками, добавляемыми к данному делегату, чтобы порядок выполнения не был согласован? – yamspog
Делегаты неизменяемы. Объединение одного с другим (что и делает, когда вы добавляете метод) возвращает новый объект Delegate и оставляет нетронутыми оригиналы. Таким образом, они по своей сути являются потокобезопасными. – thecoop
Делегат аналогична функции указатель в некотором роде, но на самом деле он ближе к интерфейсу только с одной функцией, объединенной с возможностью регистрации обработчиков и многоадресного диспетчерского механизма.
Так что это намного больше, чем указатель на функцию.
Не в классическом смысле C/C++, нет. Но концепция несколько похожа: .NET вводит концепцию delegates для обработки ситуаций, когда вам нужна переменная для вызова метода. Делегаты не могут быть «спрятаны» с помощью указателей и есть встроенная система безопасности.
Если вы используете указатели функций типа C «правильно», то концепции схожи. Но, похоже, существует много устаревшего кода, который вызывает смешные манипуляции с указателями на юбку вокруг типа безопасности или что-то не так.
Как уже было сказано, вы захотите использовать делегаты для ситуаций на C#, которые вы бы использовали указатели на функции в C++. Делегаты концептуально похожи на указатели на функции, но гораздо более приятны в использовании, поскольку они инкапсулируют не только функцию, но и «принимающий» объект, который будет «этим» вызова.
Обратите внимание, что CLR имеет концепцию указателей функций. Если бы вы внимательно проанализировали, как компилятор C# генерирует код, который создает делегаты, вы увидите, что он делает управляемую ссылку на функцию и передает ее конструктору делегата. В C# нет языковой функции, позволяющей получить указатель на функцию «голый» и напрямую манипулировать им.
Однако, поскольку концепция существует в CLR, теоретически возможно, что будущая версия C# может поддерживать указатели функций как первоклассную концепцию в небезопасном коде, так же, как мы поддерживаем указатели данных в небезопасном коде. То, что мы будем делать в этом случае, это (1) отслеживать подпись указателя функции как типа указателя и (2) испускать код, который использует код вызова «calli» (вызов через указатель) CIL.
Это позволило бы повысить эффективность в некоторых неясных сценариях взаимодействия, где сегодня в основном вы должны сделать код маршаллинга через множество обручей, создавая экземпляры делегатов исключительно так, чтобы маршаллер мог получить у них указатель функции. Если бы мы могли избежать расходов на строительство делегатов и перейти прямо к указателю на функцию, то те редкие сценарии взаимодействия могут стать менее дорогими.
Однако я не задерживал бы дыхание, ожидая этой функции, если бы был вами. Мы прототипировали его, и он работает достаточно хорошо, но я не думаю, что спрос на это требует добавления его на язык общего назначения, такой как C#.
- 1. Указатели функций в C
- 2. потокобезопасные указатели функций в C++
- 3. Общие указатели функций в C
- 4. c указатели функций
- 5. Указатели функций C
- 6. Указатели функций класса в C++
- 7. Указатели функций в объекте C
- 8. Указатели функций в Java
- 9. C++ Частичная специализация (указатели функций)
- 10. c struct и указатели функций
- 11. C++ Указатели функций против подклассов
- 12. КАК: Указатели функций класса (C++)
- 13. Есть ли указатели в java?
- 14. Есть ли указатели в javascript?
- 15. C++ Указатели функций против Switch
- 16. Указатели функций в FSM
- 17. Указатели функций, работающие как замыкания в C++
- 18. Указатели функций в fortran
- 19. Есть ли временные указатели?
- 20. Указатели функций и обратные вызовы в C
- 21. Указатели функций в конструкторе класса C++
- 22. Указатели функций в объектах
- 23. Попытка понять указатели функций в C
- 24. указатели функций с разными прототипами в c
- 25. Указатели функций и переопределенные функции в C++
- 26. Знает ли JVM какие указатели функций?
- 27. Могут ли функции и указатели функций использоваться в ObjC так же, как они есть в C?
- 28. Как использовать указатели функций?
- 29. Делегаты и указатели функций
- 30. AudioToolbox, указатели функций C и Swift
См. Также http://stackoverflow.com/questions/2535516/how-are-delegates-in-c-better-than-function-pointers-in-cc и http://www.codeproject.com/kb /cpp/FastDelegate.aspx. Автор статьи во второй ссылке рассматривает объектно-ориентированные указатели функций делегатов. –
Связанный (и интересный текст): http://stackoverflow.com/questions/7932215/could-the-clr-support-a-function-pointer-value-type – Shog9