C# 中的匿名方法是什么?

14

有人能简单地解释一下 C# 中的匿名方法是什么,并提供可能的示例吗?


1
你可能会发现这里的答案有用:https://dev59.com/xHVC5IYBdhLWcg3wsTfv - Sebastian Paaske Tørholm
4个回答

24

C# 2引入了匿名方法,作为一种创建委托实例而不必编写单独方法的方式。它们可以“捕获”封闭方法中的局部变量,使它们成为一种“闭包”形式。

匿名方法看起来像这样:

delegate (int x) { return x * 2; }

并且必须转换为特定的委托类型,例如通过赋值:

Func<int, int> foo = delegate (int x) { return x * 2; };

... 或者订阅事件处理程序:

button.Click += delegate (object sender, EventArgs e) {
    // React here
};

了解更多信息,请参见:

请注意,在 C# 3 中,Lambda 表达式 几乎 完全替代了匿名方法(尽管它们仍然完全有效)。匿名方法和 Lambda 表达式统称为 匿名函数


值得一提的是,匿名方法仅存在于本地作用域中,这意味着它们不能在程序的其他地方共享或者暴露到程序集外部。如果需要重复使用代码,您需要编写一个专用的方法来进行调用。 - Damian
@Damian:我认为没有必要强调这一点——我不记得有人想要这样做过(与匿名类型不同)。我认为从语法上很明显。 - Jon Skeet

10

匿名方法是一种没有名称且在代码所在的位置被声明的方法,例如:

Button myButton = new Button();
myButton .Click +=
delegate
{
    MessageBox.Show("Hello from anonymous method!");
};

这是否隐式地是一个Action?如果我将其分配给一个变量,然后将该变量添加到myButton.Click中,即使它不使用参数,我也必须使用EventHandler作为变量类型。 - Arlen Beiler

5

匿名方法是一段代码块,在通常需要方法的地方使用,但没有名称(因此是匿名的)。

MSDN提供了使用匿名方法的示例


那你就不需要创建一个类了吗?我假设这个方法可以从任何其他方法中调用? - James
@James - 不需要创建一个类来保存匿名方法。该方法可以从任何传递到它的地方调用 - 没有对它的引用,你无法在以后的日期调用它 - 它是匿名的。 - Will A
1
谢谢,你能指定一个匿名方法可能需要的情况吗? - James
@James - 我必须承认,C#不是我首选的语言,所以我实际上没有使用过匿名方法。但我相信其他人可以回答这个问题。 - Will A

5

这些是没有名称的方法。

例如,普通方法是:

public void Foo()
{
   Console.WriteLine("hello");
}

匿名方法可以是:

myList.ForEach(item => Console.WriteLine("Current item: " + item));

ForEach 内部的代码实际上是一个没有名称的方法,你无法从外部调用它。


4
那不是匿名方法 - 它是一个Lambda表达式。Lambda表达式和匿名方法统称为匿名函数。 - Jon Skeet
谢谢 @Jon。我只是想按照OP的要求“用简单的词语”来表达。恭喜300K!;) - Shadow The Spring Wizard

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