在C#中模拟实现boost::bind的功能

接触过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表达式略差而已。

   

  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值