是否存在这样的委托语法优于lambda表达式匿名方法的情况下?(Is there a case wh

2019-07-29 10:57发布

随着新的功能,如lambda表达式(内联代码)的出现,是否意味着我们没有使用委托或匿名方法了吗? 在几乎所有我所看到的样品,它是使用新语法重写。

任何地方,我们仍然必须使用委托和lambda表达式将无法正常工作?

Answer 1:

是的,有在哪里直接使用匿名委托和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();
}

代码失败的行会得到编译器错误“无法转换lambda表达式键入‘System.Delegate’,因为它不是一个委托类型”。



Answer 2:

拉姆达快捷方式匿名委托,但你总是会使用委托。 委托指定的方法签名。 你可以这样做:

 delegate(int i) { Console.WriteLine(i.ToString()) }

可以替换

f => Console.WriteLine(f.ToString())


Answer 3:

Lambda表达式是不是(没有意思是)银弹将取代(隐藏)代表。 这是伟大的小地方的东西,如:

List<string> names = GetNames();
names.ForEach(Console.WriteLine);
  1. 它使得代码的可读性因而容易理解。
  2. 这使得代码更短对我们这样工作少;)

在另一方面,它是非常简单的滥用它们。 长和/或复杂的lambda表达式都趋向于:

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

因此,“它意味着我们没有使用委托或匿名方法了吗?”不 - 用有得时间/可读性Lambda表达式,否则考虑使用委托。



Answer 4:

代表在C#两个方面的含义。

关键字delegate可以被用来定义一个函数签名类型。 defininge的高阶函数,即采取其他函数作为参数即函数的签名时,此通常使用。 这种利用委托的仍然是相关的。

delegate关键字,也可用于定义一个内联匿名函数。 在其中函数仅仅是一个单一的表达的情况下,lambda语法是一个简单的选择。



Answer 5:

Lambda表达式只是“语法糖”,编译器将产生相应的代表为您服务。 您可以通过使用卢茨Roeder的反射展开调查。



Answer 6:

LAMDA的是代表只是语法糖,他们不只是为inline,可以做到以下几点:

s.Find(a =>
{
    if (a.StartsWith("H"))
        return a.Equals("HI");
    else
        return !a.Equals("FOO");
});

和定义事件时,代表们仍然在使用,或当你有很多的争论,并希望实际强类型的方法被调用。



Answer 7:

对于上了年纪的一个不那么大的优势delegate语法是你,如果你不在方法体中使用它不需要指定的参数。 从MSDN

有一种情况,其中一个匿名方法提供了在lambda表达式未发现功能。 匿名方法使您可以省略参数列表。 这意味着,一个匿名方法可以转化为代表的各种签名。 这是不可能的lambda表达式。

例如,你可以这样做:

Action<int> a = delegate { }; //takes 1 argument, but not specified on the RHS

虽然这种失败:

Action<int> a = => { }; //omitted parameter, doesnt compile.

编写事件处理程序时,如该技术主要是来得心应手:

button.onClicked += delegate { Console.WriteLine("clicked"); };

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



文章来源: Is there a case where delegate syntax is preferred over lambda expression for anonymous methods?