繁体   English   中英

lambda表达式,C#中的匿名函数委托

[英]lambda expression, anonymous function delegates in C#

  1. 是否需要使用委托关键字键入所有匿名函数? 例如我们有一个Customer类,

     delegate(Customer a) {return a.name == "Michael";} 

这是匿名功能吗

    (Customer a)
    {return a.name == "Michael";}

一个功能或一个委托或两者兼而有之?

  1. 默认情况下,所有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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM