【问题标题】:What does this mean in C# or LINQ? - ( () => )这在 C# 或 LINQ 中意味着什么? - ( () => )
【发布时间】:2010-03-05 15:36:09
【问题描述】:

我在浏览 Jeffrey Palermo 的书时遇到了这种语法。

private void InitializeRepositories()
{
    Func<IVisitorRepository> builder =  () => new VisitorRepository();
    VisitorRepositoryFactory.RepositoryBuilder = builder;
}

什么意思?

【问题讨论】:

标签: c# linq


【解决方案1】:

() =&gt; 表示不带参数的lambda expression

【讨论】:

  • 我更喜欢 Python 的 lambda 版本:builder = lambda: VisitorRepository()
  • 我更喜欢 javascript 的版本:function() VisitorRepository().
  • 我更喜欢 Alonzo Church 的 lambda 版本:λ
【解决方案2】:

一般来说,它意味着一个没有参数的函数。

在这个特定的示例中,它创建了一个不带参数的匿名函数,每次都返回一个新的VisitorRepository(); 对象。

【讨论】:

    【解决方案3】:

    Func&lt;IVisitorRepository&gt; 代表不带参数并返回 IVisitorRepository 的委托。该委托的创建是一个 lambda 函数:

    () //means no parameters
    => new VisitorRepository()// means it returns a new VisitorRepository
    

    【讨论】:

      【解决方案4】:

      () 是放置变量的地方

      处理的常见事件示例类似于(sender, args)

      =&gt; // 表示将这些参数扔到这个方法中

      在 => 之后,您可以删除像 new VisitorRepositor() 这样的单行执行内容

      你可以像这样放置一个完整的函数

      Func<IRepository> = (sender, args) => 
      {
          var myObject = (SomeObject)sender;
          return new VisitorReposiroty { id = myObject.SomeId };
      }
      

      正如其他人所说,它是 lambda 表达式,它确实从处理特定事件的方法或函数中清除了您的代码。

      一旦你读得很好,它真的很有用。

      【讨论】:

        【解决方案5】:

        () => 语法是一个 lambda 表达式。 Lambda 是在 C# 3.0 中引入的,用于为委托定义匿名方法。

        委托是使用泛型 Func 定义的。所以在这种情况下,委托的签名是:没有输入参数,只有一个 IVisitorRepository 类型的输出参数。

        所以在 => lambda 数组的左侧是输入参数的名称。如果没有输入参数,只需写()。 => lambda 右侧是返回输出参数的代码,在本例中为:new VisitorRepository()。

        我建议阅读更多关于 C# 中的 lambda 表达式的内容,以完全理解这段代码。还涉及到泛型委托,因此您还需要了解泛型和委托。

        【讨论】:

          【解决方案6】:

          Func 是一个没有参数且具有 IVisitorRepository 返回值的委托。

          () => 是一个创建匿名方法的 lambda 表达式。

          new VisitorRepository() 是这个匿名方法的内容。

          所以这一行正在创建一个委托,该委托指向一个匿名方法,该方法返回一个 VisitorRepository 的实例。

          Func<IVisitorRepository> builder =  () => new VisitorRepository()
          

          在下一行中,您将静态属性的值设置为这个刚刚创建的委托。

          VisitorRepositoryFactory.RepositoryBuilder = builder;
          

          在此之后,您可以使用该属性调用匿名方法,该方法正在创建一个新的 VisitorRepository 实例。

          IVisitorRepository repository = VisitorRepositoryFactory.RepositoryBuilder();
          

          在这种情况下,存储库将是 VisitorRepository 的一个实例。

          【讨论】:

            【解决方案7】:

            表示函数不带参数,如:

            delegate() {//}
            

            【讨论】:

              猜你喜欢
              • 2012-05-29
              • 2012-12-11
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2016-06-28
              • 1970-01-01
              • 2019-08-07
              相关资源
              最近更新 更多