[英]lambda expression, anonymous function delegates in C#
是否需要使用委托关键字键入所有匿名函数? 例如我们有一个Customer类,
delegate(Customer a) {return a.name == "Michael";}
这是匿名功能吗
(Customer a)
{return a.name == "Michael";}
一个功能或一个委托或两者兼而有之?
默认情况下,所有lambda表达式也都谓词委托吗? 例如,我们有一个客户列表,即listCustomers,如果我们想使用TrueForAll函数查看是否所有客户都称为“ Michael”,则可以键入:
listCustomers.TrueForAll(x => x.name == "Michael);
但是TrueForAll将Predicate作为参数,因为我们知道Predacate是一个委托,这意味着“ x => x.name ==” Michael“默认情况下也是一个Predicate委托吗?
匿名代表的形式:
// A: C# 2.0... No one uses it in new developments since years
delegate() { }
// B: C# 3.0 and above
() => { }
为什么可以将匿名代表设置为给定代表?
Action a1 = () => Console.WriteLine("hello world");
Action<int> a2 = number => Console.WriteLine(number);
Func<bool> f1 = () => true;
这称为委托类型推断 。
总而言之,如果任务的右侧满足左侧的签名(即委托类型 ),则将右侧推断为左侧的类型。 方法参数也是如此。
另一方面,lambda表达式与使用lambda语法的委托不同:
Expression<Action> expr1 = () => Console.WriteLine("hello world");
Action a1 = () => Console.WriteLine("hello world");
第一个是表达式树 ,它是类似于抽象语法树的数据结构,可用于从epxression及其子元素中提取信息,而第二个是委托。
表达式树可以编译成委托:
Action a2 = expr1.Compile();
a2();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.