【问题标题】:C#: Anonymous method vs Named methodC#:匿名方法与命名方法
【发布时间】:2014-01-01 13:54:29
【问题描述】:

我是 SO 新手,每天都在使用一些技术 (C#) 术语进行编程和学习。

在谷歌上搜索了一段时间后,以下是我研究的关于methods的内容

  1. 方法是一个语句块,用于实现代码的可重用性 & 它还支持使用不同的 SIGNATURE 重载....例如: drawShape(2pts)、drawShape(3pts) 等...

  2. Anonymous 方法是一个带有语句块的方法,但没有 名称....(现在问这个问题还为时过早,在重量情况下,我们遇到 匿名方法...任何文章、示例...)

  3. 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 =&gt; x &lt; 10 称为 lambda 表达式,其结果是一个匿名函数,将由方法 Where 运行。

如果您是初学者,我建议您先阅读更多基础知识。查看以下链接:

【讨论】:

    【解决方案2】:

    让我们从一个简单的方法开始。

    void MyMethod()
    {
      Console.WriteLine("Inside MyMethod"); //Write to output
    }
    

    上述方法是一个named-method,它只是将Inside MyMethod写入输出窗口。

    Anonymous methods 是在一些特殊场景中使用的一些方法(使用delegates 时),其中方法定义通常较小,您不指定方法名称。

    例如,(delegate) =&gt; { Console.WriteLine("Inside Mymethod");}

    刚开始写一些简单的程序,在适当的时候,当你使用delegates或一些高级概念时,你会自己学习。 :)

    【讨论】:

      【解决方案3】:

      类比说明

      通常当我们讲故事时,我们会用名字来称呼人:

      “弗莱迪”

      “谁是弗雷迪?”

      “你知道,弗雷迪,销售部的弗雷迪——那个红头发的男人,烧毁了大楼……?”

      实际上没有人关心这个人是谁,他工作的部门等等。我们不会再提到他。我们希望能够说:“一些家伙烧毁了我们的建筑物”。所有其他的东西(头发颜色、名字等)都是不相关的和/或可以推断出来的。

      这和 c# 有什么关系?

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

      • 叫什么,
      • 以及其中的内容(参数 + 类型),
      • 以及应该输出什么(返回类型),
      • 以及您是否可以在家中进行隐私操作,或者您是否可以在公共场所进行操作。 (范围)

      当您使用方法执行此操作时,您基本上是在使用named methods。但是把它们写出来:这是一个很大的努力。尤其是如果所有这些都可以推断出来,并且您永远不会再使用它。

      这基本上是匿名方法的用武之地。它就像一种一次性方法 - 快速而肮脏的东西 - 它减少了您必须输入的数量。这基本上就是它们的目的。

      【讨论】:

        【解决方案4】:

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

        通过对比命名的任何常用方法。

        【讨论】:

          【解决方案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

          希望有帮助

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2015-02-09
            • 2013-07-16
            • 2010-11-10
            • 2011-09-12
            • 1970-01-01
            • 2018-10-08
            • 2011-08-27
            相关资源
            最近更新 更多