c# - 了解 Lambda 表达式和委托(delegate)

标签 c# .net-3.5 delegates lambda

<分区>

我已经尝试解决这个问题很长时间了(阅读在线博客和文章),但到目前为止没有成功。

什么是委托(delegate)?什么是 Lambda 表达式?两者的优缺点?何时使用其中一个或另一个的最佳实践?

提前致谢。

最佳答案

委托(delegate)是可以用作变量的方法,例如字符串等。例如,您可以声明一个带有一个参数的委托(delegate)方法:

delegate void OneArgumentDelegate(string argument);

它什么都不做,很像一个接口(interface)。如果你在任何类中有一个方法只有一个这样的参数:

void SomeMethod(string someArgument) {}

匹配委托(delegate)的签名,因此可以分配给它类型的变量:

OneArgumentDelegate ThisIsAVariable = new OneArgumentDelegate(SomeMethod);
OneArgumentDelegate ThisIsAlsoAVariable = SomeMethod; // Shorthand works too

然后这些可以作为参数传递给方法并被调用,就像这样:

void Main()
{
  DoStuff(PrintString);
}

void PrintString(string text)
{
  Console.WriteLine(text);
}

void DoStuff(OneArgumentDelegate action) 
{
  action("Hello!");
}

这将输出 Hello!

Lambda 表达式是 DoStuff(PrintString) 的简写形式,因此您不必为要使用的每个委托(delegate)变量都创建一个方法。您“创建”了一个传递给该方法的临时方法。它是这样工作的:

DoStuff(string text => Console.WriteLine(text)); // single line
DoStuff(string text => // multi line
{
  Console.WriteLine(text);
  Console.WriteLine(text);
});

Lambda 表达式只是简写,您不妨创建一个单独的方法并将其传递。我希望你现在能更好地理解它 ;-)

关于c# - 了解 Lambda 表达式和委托(delegate),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3282103/

相关文章:

c# - 将多个委托(delegate)添加到 Func<T> 并返回第一个 lambda 委托(delegate) (C#) 的结果?

javascript - 通过单击 WebBrowser Control 中的按钮来调用 C# 函数

c# - 如何使用动态 LINQ 库构建嵌套查询

.NET CIL 调用还是 CallVirt?

c# - 获取委托(delegate)中所有返回的字符串表单方法

c# - 队列消息未移至有害队列

c# - 省略 XML 声明?

paypal - 动态 Paypal 整合

swift - 重新加载正在输入新数据的父 VC 中包含的子 TableView 的最佳方法是什么?

iphone - self.delegate = self;这样做有什么问题吗?