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

Использование событий onFocus и onBlur позволяет вам достичь этого, т.е.:

onfocus="if(this.value=='EGTEXT')this.value=''" 

и

onblur="if(this.value=='')this.value='EGTEXT'"

Полный пример выглядит следующим образом:

<input name="example" type="text" id="example" size="50" value="EGTEXT" onfocus="if(this.value=='EGTEXT')this.value=''" onblur="if(this.value=='')this.value='EGTEXT'" />
8
задан 2 revs, 2 users 78% 4 June 2009 в 17:18
поделиться

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 , но не бар , это еще одна функция.

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

13
ответ дан 5 December 2019 в 13:01
поделиться

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

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

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

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

0
ответ дан 5 December 2019 в 13:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: