По крайней мере в C ++ нестатический метод ожидает получить this
в качестве скрытого параметра.Поскольку тот, кто вызывает его как обратный вызов, не знает этого, он не будет передавать этот дополнительный параметр.Если бы вам удавалось вызывать нестатическую функцию-член в качестве обратного вызова, все, что пыталось использовать данные члена (что могло бы произойти через this
), (почти наверняка) имело бы серьезные проблемы.
Я быдумаю, C # по крайней мере чем-то похож, хотя я недостаточно изучил детали, чтобы знать наверняка.Независимо от языка, код должен знать, с какими данными работать.Очевидное отличие состоит в том, что C # также поддерживает делегаты, которые чрезвычайно полезны для обратных вызовов.
Правка: как избежать этого, по крайней мере в C ++, это довольно просто.Как правило, вы хотите использовать такие библиотеки, как ACE , Boost ASIO или POCO , которые защищают вас от большинства беспорядочных деталей.Если вы оглянетесь вокруг, вы, вероятно, найдете еще как минимум несколько десятков.О, я должен добавить, что большинство библиотек в стиле фреймворка приложения (например, wxWidgets и Qt ) также включают в себя классы, чтобы оградить вас от большинства беспорядочных деталей.Очевидное отличие состоит в том, что они, как правило, «берут на себя» дизайн приложения в целом (хотя, честно говоря, я должен добавить, что ACE имеет тенденцию к тому же).
Конечно, люди написалибиблиотеки для C #, но я не использовал достаточно, чтобы дать им полезные рекомендации.Многое здесь также зависит от того уровня абстракции, который вы ищете.WCF (например) делает гораздо больше, чем просто защищает вас от грязных деталей.Скорее, он строит, по сути, свою собственную полную идею о том, как работать с сетями, что случается (где-то там) с возможностью использовать сокеты - но по большей части, вы действительно не работаете ссокеты больше, вы работаете с WCF, который использует сокеты.
В конце концов, однако, библиотека просто скрывает, а не меняет то, что на самом деле происходит.Где-то внутри библиотеки Winsock выполняет обратный вызов либо статической функции-члена, либо свободной функции, использующей основное соглашение о вызовах C, которое он ожидает.Затем эта функция использует дополнительные данные (обычно передаваемый ей параметр), чтобы выяснить, что вызывать оттуда.Что меняется, так это то, насколько толстый слой «изоляции» существует между вашим кодом и обратным вызовом из Winsock.