各种实例化委托(Func<T, T>)的区别是什么?

8

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;

它们之间有什么区别?

2个回答

8

它们都是相同的 - 只是语法糖,编译成相同的东西。

也就是说 - 通过类型推断和其他编译器好处,3只是一种非常简短的方式来表示1。


那么匿名函数和Func之间有什么区别呢? 它们是一样的吗? - user1735111
@Lior - Func 是一个已定义的委托类型。而匿名函数则没有命名的委托类型。 - Oded
@Lior,是的,在运行时它们是相同的,但在定义它们以使编译器理解它是一个接受这些特定类型参数并返回特定类型的委托时存在差异。 - Somnath

7
他们都是一样的。前两个是匿名方法的例子。最后一个是lambda表达式的示例。匿名方法和lambda表达式统称为匿名函数
匿名方法在C# 2中引入;lambda表达式在C# 3中引入,大部分取代了匿名方法。请注意,lambda表达式也可以转换为表达式树,将代码表示为数据而不是IL以及委托。
请注意,Func<TResult>Func<T, TResult>等仅是委托类型的示例。您可以将匿名函数转换为任何兼容的委托类型。例如:
public delegate int Foo(string x);

Foo foo = text => text.Length;

匿名函数和 Func 有什么区别?它们是相同的吗? - user1735111
@Lior:Func只是委托类型的名称。 - Jon Skeet
我不喜欢规范团队关于“匿名方法”和“匿名函数”的术语选择。应该反过来。在C#中有命名的“方法”。它的匿名表亲应该是匿名的“方法”,但他们选择称其为“匿名函数”。看起来不好。此外,当前的匿名方法看起来像(int i) { return i; }与数学概念中的函数非常相似,因此“匿名函数”应该更适合那里:( - nawfal

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