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