什么是C#委托,动态代理,闭包和函数指针之间的区别?

时间:2009-06-04 17:08:48

标签: language-agnostic delegates closures function-pointers dynamic-proxy

将方法或函数作为数据传递的常用方法有哪些有用的定义,例如:

  • 代表
  • 闭包
  • 功能指针
  • 按动态代理调用
  • 一流的方法?

3 个答案:

答案 0 :(得分:13)

函数指针允许您像变量一样传递函数。函数指针基本上是传统函数,用于在不支持第一类方法的语言中传递函数,例如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,这是{{1}}另一个功能。

动态代理是奇怪的。它不属于这些项目。解释它需要一些非常长的文本。它起源于着名的Proxy Pattern。 Proxy Pattern的问题在于Proxy类需要实现与Subject相同的接口。动态代理基本上意味着使用反射方法来发现Subject的方法,以便释放ProxyPattern不被绑定到Subject的接口。

答案 1 :(得分:0)

只是我所知道的:

  • 函数指针:就是那个指向一段代码的指针。你跳到它,它执行。类型语言可以强制执行一些参数传递约定(即C声明)
  • 闭包:一个状态配对的函数。最自然地用词汇范围的语言编写(即Scheme,JavaScript,Lua)。几个闭包可以共享相同的状态(或其中的一部分),使其成为实现OOP的简单方法。
  • 第一类方法:从对象实例和方法创建的闭包。一些具有闭包和本机OOP(Python,JavaScript)的语言可以自动创建闭包。

答案 2 :(得分:0)

Closure是一种编程语言概念。 Delegate是它在MS.NET中的实现。

MS.NET中的委托是指向对象方法的强类型指针(委托实例指向两者 - 对象及其方法)。还有一种方法可以将多个void委托实例合并为一个。