【问题标题】:Difference between various ways of instantiating a delegate (Func<T, T>)?实例化委托的各种方式之间的区别(Func<T, T>)?
【发布时间】:2013-02-23 15:07:08
【问题描述】:

1

Func<int, int> myFunc = new Func<int,int>(delegate(int x) {
    return x + 1;
});

2

Func<int, int> myFunc = delegate(int x) {
    return x + 1;
};

3

Func<int, int> myFunc = x => x + 1;

它们有什么区别?

【问题讨论】:

标签: c# syntax delegates anonymous-function func


【解决方案1】:

它们都是相同的 - 只是 syntactic sugar 编译成相同的东西。

也就是说 - 使用类型推断和其他编译器好东西,3 只是说 1 的一种非常非常短的方式。

【讨论】:

  • 那么匿名函数和Func有什么区别呢?它们是一样的吗?
  • @Lior - Func 是一个已定义的委托。匿名函数没有命名委托类型。
  • @Lior ,是的,它们在运行时是相同的,但是您如何定义它们以使编译器理解它是一个接受这些许多特定类型参数并返回特定类型的委托。跨度>
【解决方案2】:

它们都是一样的。前两个是anonymous methods 的示例。最后一个是lambda expression 的示例。匿名方法和 lambda 表达式统称为匿名函数

C# 2 中引入了匿名方法; lambda 表达式是在 C# 3 中引入的,主要取代了匿名方法。请注意,lambda 表达式也可以转换为expression trees,它将代码表示为数据而不是 IL,以及代表。

请注意,Func&lt;TResult&gt;Func&lt;T, TResult&gt; 等只是委托类型的示例。您可以将匿名函数转换为任何兼容的委托类型。例如:

public delegate int Foo(string x);

Foo foo = text => text.Length;

【讨论】:

  • 那么匿名函数和Func有什么区别呢?它们是一样的吗?
  • @Lior: Func 只是委托类型的名称。
  • 我不喜欢规范团队选择的关于“匿名方法”和“匿名函数”的术语。应该是其他方式。在 C# 中,有一个名为“方法”的名称。它的匿名表亲应该是匿名的“方法”,但他们选择称它为“匿名函数”。看起来不太好。此外,当前看起来像 (int i) { return i; } 的匿名方法听起来非常熟悉函数的数学概念,因此“匿名函数”应该更适合那里:(
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多