C#: 匿名方法 vs 命名方法

11

我是SO和编程的新手,正在逐渐学习技术(C#)术语。

通过谷歌搜索,以下是我对"方法(methods)"的研究:

  1. "方法"是一组语句,用于代码的可重用性,并且它还支持具有不同签名的重载...例如:drawShape(2pts), drawShape(3pts)等...

  2. "匿名方法"是一个带有语句块但没有名称的方法...(因为目前还不清楚在什么情况下会使用匿名方法,请问是否有文章、示例...)

  3. "命名方法(Named method)":这里有一个链接,但最后我并没有理解"命名方法"实际上是什么...

能否有人解释一下"命名方法"是什么,以及我们在哪里使用匿名方法?


plz bear any mistakes.... - c-sharp user
5个回答

10

命名方法是指可以通过其名称调用的方法(例如,它是一个具有名称的函数)。例如,您已经定义了一个用于添加两个数字的函数:

int f(int x, int y)
{
    return x+y;
}

你可以像这样通过方法名来调用它:f(1, 2);
匿名方法是一种无需名称作为参数传递给函数的方法。这些方法可以在运行时构建,也可以在编译时从 lambda表达式 中求值。
这些方法经常用于 LINQ 查询中,例如:
int maxSmallerThan10 = array.Where(x => x < 10).Max();

表达式x => x < 10被称为lambda表达式,其结果是一个匿名函数,将由方法Where运行。

如果您是初学者,我建议您先阅读更基础的内容。请查看以下链接:


1
让我们从一个简单的方法开始。
void MyMethod()
{
  Console.WriteLine("Inside MyMethod"); //Write to output
}

上述方法是一个名为named-method的方法,它只是将Inside MyMethod写入输出窗口。 匿名方法是在某些特殊情况下使用的一些方法(当使用delegates时),其中方法定义通常较小,您不需要指定方法名称。
例如,(delegate) => { Console.WriteLine("Inside Mymethod");} 只需开始编写一些简单的程序,在学习过程中使用delegates或其他高级概念时,您将自己学会。 :)

1

类比解释

通常我们讲故事时会用名字来指代人:

"弗雷迪"

"谁是弗雷迪?"

"你知道的,弗雷迪,销售部门的那个男人,红头发,烧毁了大楼的那个人...?"

实际上,没有人关心这个人是谁,他在哪个部门工作等等。我们只想说:“有个烧掉了我们的大楼”。其他的东西(比如头发颜色、名字等)都是无关紧要的或者可以推断出来。

这与c#有什么关系呢?

通常在c#中,如果您想使用一个方法,您必须定义它:您必须告诉编译器(通常):

  • 它叫什么名字,
  • 需要输入什么(参数+它们的类型),
  • 以及应该输出什么(返回类型),
  • 以及它是您可以在家里做的事情还是您可以在公共场合做的事情。(范围)
当你使用方法时,基本上是在使用“命名方法”。但将它们写出来需要很多努力,特别是如果所有这些都可以推断出来,并且你永远不会再次使用它们。
这就是匿名方法的作用。它就像是一种可丢弃的方法 - 快速而肮脏的东西 - 它减少了你需要输入的量。这基本上就是它们的目的。

0

匿名方法或匿名函数,看起来是一样的,基本上都是委托。正如您指出的链接http://msdn.microsoft.com/en-us/library/bb882516.aspx所描述的那样,匿名方法提供了一种简化的方式来传递要由另一个方法执行的方法。就像回调一样。 另一种看待它的方式是考虑lambda表达式。

与之相对的是任何普通方法的命名。


0

来自MSDN:

委托可以与命名方法关联。当您使用命名方法实例化委托时,该方法将作为参数传递。这称为使用命名方法。使用命名方法构造的委托可以封装静态方法或实例方法。在早期版本的C#中,命名方法是实例化委托的唯一方式。然而,在不希望创建新方法的情况下,C#允许您实例化委托并立即指定代码块,该委托在调用时将处理该代码块。该块可以包含lambda表达式或匿名方法。

在 C# 2.0 之前的版本中,声明委托的唯一方法是使用命名方法。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

希望这有所帮助。

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