【问题标题】:C#: Anonymous method vs Named methodC#:匿名方法与命名方法
【发布时间】:2014-01-01 13:54:29
【问题描述】:
我是 SO 新手,每天都在使用一些技术 (C#) 术语进行编程和学习。
在谷歌上搜索了一段时间后,以下是我研究的关于methods的内容
方法是一个语句块,用于实现代码的可重用性
& 它还支持使用不同的 SIGNATURE 重载....例如:
drawShape(2pts)、drawShape(3pts) 等...
Anonymous 方法是一个带有语句块的方法,但没有
名称....(现在问这个问题还为时过早,在重量情况下,我们遇到
匿名方法...任何文章、示例...)
Named method:这里是a link,但最后我没有得到命名方法实际上是什么......
谁能解释一下什么是“命名”方法,我们在哪里使用匿名方法?
【问题讨论】:
标签:
c#
anonymous-function
anonymous-methods
【解决方案1】:
命名方法是您可以通过其名称调用的方法(例如,它是一个有名称的函数)。例如,您定义了一个将两个数字相加的函数:
int f(int x, int y)
{
return x+y;
}
你可以这样称呼这个方法:f(1, 2);。
匿名方法是一种无需名称即可作为参数传递给函数的方法。这些方法可以在运行时构造或在编译时从lambda expression 评估。
这些方法常用于LINQ查询,例如:
int maxSmallerThan10 = array.Where(x => x < 10).Max();
表达式 x => x < 10 称为 lambda 表达式,其结果是一个匿名函数,将由方法 Where 运行。
如果您是初学者,我建议您先阅读更多基础知识。查看以下链接:
【解决方案2】:
让我们从一个简单的方法开始。
void MyMethod()
{
Console.WriteLine("Inside MyMethod"); //Write to output
}
上述方法是一个named-method,它只是将Inside MyMethod写入输出窗口。
Anonymous methods 是在一些特殊场景中使用的一些方法(使用delegates 时),其中方法定义通常较小,您不指定方法名称。
例如,(delegate) => { Console.WriteLine("Inside Mymethod");}
刚开始写一些简单的程序,在适当的时候,当你使用delegates或一些高级概念时,你会自己学习。 :)
【解决方案3】:
类比说明
通常当我们讲故事时,我们会用名字来称呼人:
“弗莱迪”
“谁是弗雷迪?”
“你知道,弗雷迪,销售部的弗雷迪——那个红头发的男人,烧毁了大楼……?”
实际上没有人关心谁这个人是谁,他工作的部门等等。我们不会再提到他。我们希望能够说:“一些家伙烧毁了我们的建筑物”。所有其他的东西(头发颜色、名字等)都是不相关的和/或可以推断出来的。
这和 c# 有什么关系?
通常在 c# 中,如果你想使用它,你必须定义一个方法:你必须告诉编译器(通常):
- 叫什么,
- 以及其中的内容(参数 + 类型),
- 以及应该输出什么(返回类型),
- 以及您是否可以在家中进行隐私操作,或者您是否可以在公共场所进行操作。 (范围)
当您使用方法执行此操作时,您基本上是在使用named methods。但是把它们写出来:这是一个很大的努力。尤其是如果所有这些都可以推断出来,并且您永远不会再使用它。
这基本上是匿名方法的用武之地。它就像一种一次性方法 - 快速而肮脏的东西 - 它减少了您必须输入的数量。这基本上就是它们的目的。
【解决方案5】:
来自 MSDN:
委托可以与命名方法相关联。当您使用命名方法实例化委托时,该方法将作为参数传递。这是使用命名方法调用的。使用命名方法构造的委托可以封装静态方法或实例方法。命名方法是在早期版本的 C# 中实例化委托的唯一方法。但是,在创建新方法需要额外开销的情况下,C# 使您能够实例化委托并立即指定委托在调用时将处理的代码块。该块可以包含 lambda 表达式或匿名方法。
和
在 2.0 之前的 C# 版本中,声明委托的唯一方法是使用命名方法。 C# 2.0 引入了匿名方法,在 C# 3.0 及更高版本中,lambda 表达式取代了匿名方法,成为编写内联代码的首选方式。但是,本主题中有关匿名方法的信息也适用于 lambda 表达式。在一种情况下,匿名方法提供了 lambda 表达式中没有的功能。匿名方法使您能够省略参数列表。这意味着可以将匿名方法转换为具有各种签名的委托。这对于 lambda 表达式是不可能的。有关 lambda 表达式的详细信息,请参阅 Lambda 表达式(C# 编程指南)。创建匿名方法本质上是一种将代码块作为委托参数传递的方法。通过使用匿名方法,您可以减少实例化委托的编码开销,因为您不必创建单独的方法。
因此,在回答您关于何时使用匿名方法的问题时,MSDN 说:在创建新方法是不必要的开销的情况下。
根据我的经验,这更多是代码重用和可读性的问题。
链接:
http://msdn.microsoft.com/en-us/library/98dc08ac.aspx
http://msdn.microsoft.com/en-us/library/0yw3tz5k.aspx
希望有帮助