欢迎您来到GIS动力

加入收藏 免费注册 用户登陆 帮助中心
首页 新闻动态 技术专栏 银杏树下 学习考研 软件下载 求职招聘 许愿瓶 节日祝福 用户中心 精彩推荐 资源搜索 地图
专栏导航: AO开发 | SO开发 | ArcGIS桌面 | 超图桌面 | 开发语言 | 数据库 | WebGIS | 银杏文学 | 研究生考题 | FreeMap FreeTalk
   您现在位于: 首页技术专栏开发语言 → 正文
在C#中模拟实现boost::bind的功能
08-09-03 10:23:07 作者:天方 出处:http://www.cnblogs.com/TianFang

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


(本文已被浏览 次)
发布人:admin
推荐给好友:发送给好友
上篇新闻:
下篇新闻:
相关评论
发表我的评论
  • 尊重网上道德,遵守《全国人大常委会关于维护互联网安全的决定》及中华人民共和国其他各项有关法律法;
  • 本站有权保留或删除您发表的任何评论内容;
  •   相关文章  
    无相关新闻

    关于我们友情链接 ┋ 与我在线 ┋ 管理 ┋ TOP
     
    网站当前版本:GisPower CMS V3.0
    『GIS 动力』- http://www.gispower.org/
    联系我们:webmaster#gispower.org
    Copyright (c) 2003-2007 GisPOwer.Org. All Rights Reserved.
     

                   滇ICP备05006901号