В чем разница между делегатами C #, динамическим прокси, замыканиями и указателями на функции? - PullRequest
8 голосов
/ 04 июня 2009

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

  • Делегаты
  • Затворы
  • Функциональные указатели
  • Вызов динамическим прокси и
  • Первоклассные методы?

Ответы [ 3 ]

13 голосов
/ 07 июня 2009

Указатели на функции позволяет передавать функции как переменные. Указатель на функцию - это в основном устаревший метод для передачи функции в языках, которые не поддерживают первоклассные методы, таких как 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, что является другой функцией.

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

0 голосов
/ 05 июня 2009

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

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

0 голосов
/ 04 июня 2009

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

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