是否存在委托语法优先于匿名方法的lambda表达式的情况?

dra*_*gon 12 c# lambda delegates anonymous-methods .net-3.5

随着lambda表达式(内联代码)等新功能的出现,它是否意味着我们不再需要使用委托或匿名方法了?在我看过的几乎所有样本中,都是使用新语法进行重写.

我们仍然需要使用delegates和lambda表达式的任何地方都不起作用?

Jam*_*ing 27

是的,有些地方直接使用匿名委托,lambda表达式不起作用.

如果方法采用无类型的委托,则编译器不知道将匿名委托/ lambda表达式解析为什么,并且您将收到编译器错误.

public static void Invoke(Delegate d)
{
  d.DynamicInvoke();
}

static void Main(string[] args)
{
  // fails
  Invoke(() => Console.WriteLine("Test"));

  // works
  Invoke(new Action(() => Console.WriteLine("Test")));

  Console.ReadKey();
}
Run Code Online (Sandbox Code Playgroud)

失败的代码行将得到编译器错误"无法将lambda表达式转换为类型'System.Delegate',因为它不是委托类型".


Dar*_*opp 8

lambda是匿名委托的快捷方式,但您将始终使用委托.委托指定方法签名.你可以这样做:

 delegate(int i) { Console.WriteLine(i.ToString()) }
Run Code Online (Sandbox Code Playgroud)

可以替换为

f => Console.WriteLine(f.ToString())
Run Code Online (Sandbox Code Playgroud)


Dan*_*kas 7

Lambda表达式不是(并不意味着)一个替代(隐藏)代表的银弹.当地的小东西很棒,比如:

List<string> names = GetNames();
names.ForEach(Console.WriteLine);
Run Code Online (Sandbox Code Playgroud)
  1. 它使代码更易读,因此易于理解.
  2. 它使代码更短,因此对我们来说工作量减少;)

另一方面,滥用它们非常简单.长或/和复杂的lambda表达式倾向于:

  1. 新开发人员很难理解
  2. 面向对象较少
  3. 更难阅读

所以"这是否意味着我们不再需要使用委托或匿名方法?"否 - 使用Lambda表达式,您可以在其中赢得时间/可读性,否则请考虑使用委托.


naw*_*fal 5

旧语法的一个不太大的delegate优点是,如果不在方法主体中使用参数,则无需指定参数。来自msdn

在一种情况下,匿名方法提供了 lambda 表达式中没有的功能。匿名方法使您能够省略参数列表。这意味着匿名方法可以转换为具有各种签名的委托。这对于 lambda 表达式来说是不可能的。

例如你可以这样做:

Action<int> a = delegate { }; //takes 1 argument, but not specified on the RHS
Run Code Online (Sandbox Code Playgroud)

虽然这失败了:

Action<int> a = => { }; //omitted parameter, doesnt compile.
Run Code Online (Sandbox Code Playgroud)

这种技术在编写事件处理程序时非常方便,例如:

button.onClicked += delegate { Console.WriteLine("clicked"); };
Run Code Online (Sandbox Code Playgroud)

这并不是一个很强的优势。恕我直言,最好总是采用更新的语法。