随着新的功能,如lambda表达式(内联代码)的出现,是否意味着我们没有使用委托或匿名方法了吗? 在几乎所有我所看到的样品,它是使用新语法重写。
任何地方,我们仍然必须使用委托和lambda表达式将无法正常工作?
随着新的功能,如lambda表达式(内联代码)的出现,是否意味着我们没有使用委托或匿名方法了吗? 在几乎所有我所看到的样品,它是使用新语法重写。
任何地方,我们仍然必须使用委托和lambda表达式将无法正常工作?
是的,有在哪里直接使用匿名委托和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’,因为它不是一个委托类型”。
拉姆达快捷方式匿名委托,但你总是会使用委托。 委托指定的方法签名。 你可以这样做:
delegate(int i) { Console.WriteLine(i.ToString()) }
可以替换
f => Console.WriteLine(f.ToString())
Lambda表达式是不是(没有意思是)银弹将取代(隐藏)代表。 这是伟大的小地方的东西,如:
List<string> names = GetNames();
names.ForEach(Console.WriteLine);
在另一方面,它是非常简单的滥用它们。 长和/或复杂的lambda表达式都趋向于:
因此,“它意味着我们没有使用委托或匿名方法了吗?”不 - 用有得时间/可读性Lambda表达式,否则考虑使用委托。
代表在C#两个方面的含义。
关键字delegate
可以被用来定义一个函数签名类型。 defininge的高阶函数,即采取其他函数作为参数即函数的签名时,此通常使用。 这种利用委托的仍然是相关的。
的delegate
关键字,也可用于定义一个内联匿名函数。 在其中函数仅仅是一个单一的表达的情况下,lambda语法是一个简单的选择。
Lambda表达式只是“语法糖”,编译器将产生相应的代表为您服务。 您可以通过使用卢茨Roeder的反射展开调查。
LAMDA的是代表只是语法糖,他们不只是为inline,可以做到以下几点:
s.Find(a =>
{
if (a.StartsWith("H"))
return a.Equals("HI");
else
return !a.Equals("FOO");
});
和定义事件时,代表们仍然在使用,或当你有很多的争论,并希望实际强类型的方法被调用。
对于上了年纪的一个不那么大的优势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"); };
这不是一个很强的优势。 最好是采用较新的语法总是恕我直言。