В чем разница между делегатами C#, динамическим Прокси, закрытиями и указателями функций?

каковы полезные определения для общих методов передачи метода или функции в качестве данных, таких как:

  • представители
  • закрытие
  • указатели на функции
  • вызов динамическим прокси и
  • методы первого класса?

3 ответов


указатели на функции позволяет передавать функции как переменные. Указатель функции-это в основном устаревший метод передачи функции на языках, которые не поддерживают первоклассные методы, такие как C/C++.

методы первого класса в основном означает, что вы можете передавать функции, такие как переменные. Методы (слабо) означают функции. Таким образом функции. Проще говоря, это означает, что функции рассматриваются как "первоклассные граждане", например. В старые времена (C/C++), поскольку мы не можем напрямую передавать функцию, и нам пришлось прибегать к обходным путям, таким как указатели функций, мы сказали, что функции не являются первоклассными гражданами.

представители является ответом C#на первоклассные методы. Делегаты несколько более могущественны, потому что это включает закрытие рассмотрим следующий фрагмент кода:

void foo( int a )
{
   void bar() { writefln( a ); }
   call( &bar );
}

void call( void delegate() dg  ) { dg(); }
int main( char[][] args ) {
   foo( 100 );
}

обратите внимание, что bar ссылка на локальная переменная a потому что делегаты могут использовать замыкания.

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

Динамический Прокси - это лишнее. Он не принадлежит к этим предметам. Объяснение требует очень длинного текста. Это происходит от знаменитого Прокси-Шаблон. Проблема с прокси-шаблоном заключалась в том, что прокси-класс должен реализовывать тот же интерфейс, что и субъект. Динамический прокси в основном означает использование отражающего подход к обнаружению метода субъекта, чтобы ProxyPattern можно было освободить от привязки к интерфейсу субъекта.


только те, о которых я знаю:

  • указатели функций: просто указатель на фрагмент кода. вы прыгаете к нему, он исполняется. типизированные языки могут применять некоторые соглашения о передаче параметров (например, объявления C)
  • замыкания: функция с некоторым состоянием в паре. наиболее естественно написано на лексически ограниченных языках (например, Scheme, JavaScript, Lua). несколько замыканий могут иметь одно и то же состояние (или его часть), что делает его простым способом реализации ООП.
  • методы первого класса: закрытие, созданное из экземпляра объекта и метода. некоторые языки с закрытиями и собственным ООП (Python, JavaScript) могут создавать закрытия автоматически.

закрытие-это концепция языка программирования. Делегат-это его реализация в MS.NET.

делегат в MS.NET является строго типизированным указателем на метод объекта (экземпляр делегата указывает как на объект, так и на его метод). Существует также способ объединить несколько экземпляров делегата void в один.