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

sal*_*sal 8 language-agnostic delegates closures function-pointers dynamic-proxy

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

  • 代表
  • 关闭
  • 函数指针
  • 通过动态代理调用和
  • 一流的方法?

kiz*_*zx2 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 );
}
Run Code Online (Sandbox Code Playgroud)

请注意,bar可以引用局部变量,a因为委托可以使用闭包.

封闭起初可能非常混乱.但是懒人的定义可以非常简单.它基本上意味着变量可以以人类预期的方式获得.换句话说,通过读取源代码的结构,可以在它们看起来像它们存在的地方引用变量.例如,查看上面的代码片段.如果我们没有封闭,bar就无法引用a因为a只是本地的foo,但不是bar,这是另一个功能.

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