代码之家  ›  专栏  ›  技术社区  ›  Razor

表达式<func<>>与func<>[重复]之间的差异

  •  73
  • Razor  · 技术社区  · 14 年前

    例如,为什么大多数linq操作符接受 Expression<Func<TSource>> 及其等价物 Func<TSource> ?

    使用泛型的好处/原因是什么 Expression 类而不是直接的lambda语法?

    4 回复  |  直到 9 年前
        1
  •  59
  •   Andrew Hare    14 年前

    使用 Expression<T> 您正在显式创建 expression tree -这意味着您可以像处理数据一样处理组成查询的代码。

    原因是linq提供程序(例如linq to sql)检查查询本身,以确定将c表达式转换为t-sql查询的最佳方式。由于表达式树允许您将代码视为数据,所以提供程序可以这样做。

        2
  •  30
  •   masoud ramezani    11 年前

    总之,两者之间的主要区别如下:

    • Expression<Func<...>> 是一个 表达式树 它表示原始源代码(它存储在一个类似于树的数据结构中,非常接近原始C代码)。在这个表单中,您可以分析源代码,像linq-to-sql这样的工具可以将表达式树(源代码)转换为其他语言(例如,在linq-to-sql的情况下是sql,但是您也可以以javascript为目标)。

    • Func<...> 是可以执行的普通委托。在这种情况下,编译器将函数体编译为中间语言(IL),就像编译标准方法一样。

    值得一提的是 Expression<..> 有一个 Compile 在运行时编译表达式并生成 功能<…> ,所以有从第一个到第二个的转换(需要一些性能成本)。但是,没有从第二个到第一个的转换,因为一旦得到il,就很难(不可能)重建原始源代码。

        3
  •  16
  •   Justin Niessner    14 年前

    Func<T> 创建可执行函数。

    Expression<Func<T>> 创建表达式树,允许您将函数中的代码用作数据。

    表达式树允许您通过从.NET代码生成底层调用来执行诸如LINQ到SQL和LINQ到XML之类的操作。

        4
  •  7
  •   tvanfosson    14 年前

    Expression<Func<>> 是尚未转换为代码的函数的表示形式。一 Func<> 是一个实际的可执行函数。使用前者可以在调用表达式时将其转换为适当的函数。例如,对于linq to sql,这将把它转换成等价的代码来执行sql语句并返回指定的内容。使用linq to对象,它将使用clr在客户机上执行代码。一 FUNC & LT; 总是在CLR中执行——它是可执行代码。