函数当参数传递有什么用??
最近和一位同事说下Linq,我提到Linq里很多方法表面来看是把原先不怎么常用的一种技巧正式化了下,就是把函数当参数传递,同事有点不理解,或者这样说,在工作中这有什么用处.
我这里给出二种简单比较常用的用法.
这里想法比较简单,也很容易想到,我有时导出几份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:说实话,理论上的讲解很麻烦,我只有更多从实例来说.有理解错误的地方,大家请指出.谢谢.