函数当参数传递有什么用??

最近和一位同事说下Linq,我提到Linq里很多方法表面来看是把原先不怎么常用的一种技巧正式化了下,就是把函数当参数传递,同事有点不理解,或者这样说,在工作中这有什么用处.

我这里给出二种简单比较常用的用法.

1.填充多Execl去重复代码.

这里想法比较简单,也很容易想到,我有时导出几份Execl时,那么相应的就会有打开Execl,填充Execl,关闭保存Execl这三步.

但是这几份Execl里,打开Execl,关闭保存Execl是相同的.我们代码工人都知道不要写重复代码.那么好,封装吧.........

但是关键是填充Execl这步不一样,怎么做(不要告诉我用设计模式来封装多种模式,然后用不同模式来填充啊.)很简单,

因为填充Execl不一样,也就是说,要填充的Execl表格Worksheet不一样,在这里就可以把函数当参数传递.如下.

public string OnAction(params Action<Worksheet>[] actions)

{

      //打开Execl

    for(int i = 0;i < actions.Length;i++) 

  { 

    wsheet = myExecl.Worksheets.getItem(i+1);

    //在这里填充相应的Execl表格Worksheet,至于怎么填充的,就看你相对应的action[i]方法的实现了.

    action[i](wsheet);

  }

  //关闭保存Execl

}

2.ASP.NET 写的 泛型委托在项目中的应用.

这里给我们展示了一种场景.

具体场景:在客户端调用WCF服务时,我们都需要在客户做异常处理,最常见的错误异常为CommunicationException,TimeoutException,Exception.

通常我们只能执行这个方法,然后捕获异常.一个二个方法没什么.如果到达10个会怎么样,还不说100的时候.你的项目里就全是那些一模一样的Try{}Catch{}.

幸好,作者给了我们一种处理方法.

把方法作为一个对象来考虑,我只考虑方法执行的异常情况,你怎么处理我不管.如下.

public static void Invoke<TContract>(TContract proxy, Action<TContract> action)
{

  try{

    action(proxy));

  }

     catch()

  {

  }

  catch()

  {

  }

}

这样整个世界清静了.

 

PS:说实话,理论上的讲解很麻烦,我只有更多从实例来说.有理解错误的地方,大家请指出.谢谢.

posted @ 2010-04-28 12:36  天天不在  阅读(2239)  评论(4编辑  收藏  举报