接触过boost的c++编程的朋友可能对boost::bind的印象比较深刻,通过它可以很容易的改变函数的参数个数,实现函数的委托封装。在异步编程中有着广泛的应用。
在C#中却没有提供这一功能,然而,得益于C#强大而灵活的语法机制,我们可以用匿名函数很容易的模拟实现这一过程。
首先看一下如下三个函数:
static int foo()
{
return 0;
}
static int foo1(int i)
{
return i;
}
static int foo2(int i, int j)
{
return i + j;
}
对于这样的三个函数,假如我们需要使用委托来调用它们,委托定义如下:
delegate int FooHanlder(int x);
在一般情况下,这一个委托只能调用foo1函数,如下所示:
FooHanlder f1 = foo1;
在C++中,可以通过bind的封装,使得FooHanlder也能调用foo和foo2函数。伪代码如下:
FooHanlder f = bind(foo);
FooHanlder f2 = bind(foo2, 3, _1);
虽然C#并不支持bind,我们却可以用另外一种同样优雅的方式实现同样的效果:
FooHanlder f = x => foo();
FooHanlder f2 = x => foo2(3,x);
这里其实就是通过C# lambda表达式对foo和foo2函数进行了一层封装,构造一个FooHanlder形式的匿名函数,从而实现类似bind的功能。非常简单易用。
PS:.net 2.0下可以通过匿名函数来实现同样的效果,只不过可视性上比lambda表达式略差而已。