C#委托定义 - 匿名方法 vs. 显式定义方法

4
什么时候应该在定义委托时使用匿名方法,什么时候应该使用正式定义的方法?
2个回答

11

如果你需要在多个地方使用相同的逻辑,那么将其放到单独的方法中会更加合理。

如果你只需要使用一次这个逻辑并且它相当简短,那么使用匿名函数会更加合适。如果委托需要访问创建它的方法中的局部变量,那么匿名函数可以作为闭包来使用,这也非常方便。

此外,即使匿名函数相对较长,如果用于像Parallel Extensions这样的并行处理,它仍然可能很有用——这种情况下,你可以将现有的串行代码“原地”并行化。

你还应该考虑可测试性——如果你的委托代码足够复杂,需要自己的单元测试,那么将其公开为一个方法是非常明智的。(不幸的是,它必须作为一个内部方法使用InternalsVisibleTo或者一个公共方法,而通常你希望它是私有的,但这就是生活。)


分离逻辑是我没有考虑过的,而不需要传递参数就能轻松访问本地变量的便利性非常有趣。并行扩展是C# 4.0的功能吗? - Scott Davies
我想补充的是这两个并不是互相排斥的。通常有一个大部分调用常规函数的匿名函数非常方便,可以同时获得可重用性和闭包的优势。 - Steven Sudit
是的,Parallel Extensions 已经随着 4.0 版本一起发布了。 - Steven Sudit
我觉得能够在闭包中捕获局部变量的能力非常方便。就 VS 2010 而言,到目前为止,它相当不错。我已经使用它来编写 C# 3.0 和 C++ 程序大约一个月了。它存在一些稳定性问题,并且对于许多人来说,打字可能会感觉“缓慢”和不流畅(在 Rico Mariani 的博客 http://blogs.msdn.com/ricom/ 上有记录)。如果我要用它进行任何严格的开发,我可能会等到 Beta 2,这样可以解决更多问题。 - smaclell
@smalcell - 感谢您的意见,特别是关于稳定性方面的建议。我将在虚拟机中进行操作,这会降低性能,但可以隔离我的主要开发环境。@Jon Skeet - 太酷了!我买了你的第一版书,它是我接下来要读的。Manning出版社的书很棒!第二版是否有关于C# 3.0的更新?如果有的话,我会MEAP它。 - Scott Davies
显示剩余4条评论

5

当应该只由委托执行函数时(换句话说:当我不需要在任何其他地方使用该函数),并且要执行的函数/方法相对较短(最多5行),我使用匿名方法。

但是,并没有明确规定何时使用什么。
在我看来,大多数情况下匿名方法对可读性没有贡献,所以我大多数情况下不使用它们。


啊,相对较短的长度这一点说得有道理。谢谢你对可读性的看法,因为我发现匿名语法有点更复杂,我想知道这是否只是我的问题! - Scott Davies

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接