Delegate与lambda在类成员赋值中的关系



我在Xamarin实现了一个DatePickerFragment。安卓系统,并遵循官方文档。并注意到一些奇怪的事情。

处理程序是这样声明的

Action<DateTime> _dateSelectedHandler = delegate { };

主要通过Linq和线程使用lambda表达式。根据我的经验,我想把这个改成bc它们是一样的。即使我将鼠标悬停在委托上,工具提示也会显示"Lambda表达式"。

所以我试了这个:

Action<DateTime> _dateSelectedHandler = () => { };

我在这里得到的错误是Delegate action不接受0参数。但是在我的第一个例子中捕捉到了什么参数呢?我想这是因为Action类的原因,所以我这样做了:

Action<DateTime> _dateSelectedHandler = (aux) => { };

在这种情况下,aux的类型是DateTime,这是可以的。然而,我还是很困惑。我查阅了同事们推荐的一本书。c# 8.0概览:J. Albahari和E. Johannsen的权威参考。在那里,我发现委托是调用方法的对象,而lambda表达式是代替委托实例编写的方法。按照这个定义,我们为什么要作为开发人员曾经使用委托吗?委托只是一个带有额外步骤的lambda。

(aux) => { };是lambda语句。注意,aux还没有类型。另一方面,Action<DateTime>是一个委托,并且具有特定的类型。lambda语句中的参数类型是从分配给它的委托的类型推断出来的。所以lambda语句可以被看作是委托之上的语法糖。

我个人倾向于使用内置的Func<> / Action<>委托,而不是创建自定义委托。我倾向于通过分配lambda函数来创建委托,而不是显式地创建委托,并让编译器自行推断类型。

但这并不意味着委托不用于使整个系统工作,只是很少需要使用delegate关键字。

最新更新