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();
}
失败的代码行将得到编译器错误"无法将lambda表达式转换为类型'System.Delegate',因为它不是委托类型".
lambda是匿名委托的快捷方式,但您将始终使用委托.委托指定方法签名.你可以这样做:
 delegate(int i) { Console.WriteLine(i.ToString()) }
可以替换为
f => Console.WriteLine(f.ToString())
Lambda表达式不是(并不意味着)一个替代(隐藏)代表的银弹.当地的小东西很棒,比如:
List<string> names = GetNames();
names.ForEach(Console.WriteLine);
另一方面,滥用它们非常简单.长或/和复杂的lambda表达式倾向于:
所以"这是否意味着我们不再需要使用委托或匿名方法?"否 - 使用Lambda表达式,您可以在其中赢得时间/可读性,否则请考虑使用委托.
旧语法的一个不太大的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"); };
这并不是一个很强的优势。恕我直言,最好总是采用更新的语法。
| 归档时间: | 
 | 
| 查看次数: | 12974 次 | 
| 最近记录: |