为什么我可以在=>在lambda表达式中,如何将其转换为标准语法

本文关键字:转换 语法 标准 我可以 lambda 表达式 为什么 | 更新日期: 2023-09-27 17:51:14

我已经尝试理解lambda表达式很长时间了(多次尝试)。

在Razor视图中,我在ICollection<Comment> Comments上有一个foreach循环,其中ModelProduct类。

@foreach (var comment in Model.Comments) {
            <p> @Html.DisplayFor(m => comment.TimeStamp)</p>
}

我不明白为什么我可以在表达式中使用=>之前的任何字母,它仍然有效。如果这并不重要,为什么我必须在=>之前写任何东西?

如何翻译(如果可能的话)到标准方法语法?

为什么我可以在=>在lambda表达式中,如何将其转换为标准语法

在您的示例中,m是您的函数的参数,用于将comment的值传递给您的函数。但是,使用lambda,您仍然可以访问直接使用的comment。不使用该参数并不意味着可以不使用它。

因此,您可以将代码片段重写为:
@foreach (var comment in Model.Comments) {
        <p> @Html.DisplayFor(m => m.TimeStamp)</p>
}

重要的是要理解lambda本质上是匿名函数声明。

1) 我不明白为什么我可以在表达式中使用=>前面的任何字母而它仍然有效

m只是参数名。您可以写@Html.DisplayFor(m => m.TimeStamp)@Html.DisplayFor(i => i.TimeStamp),它将是(在这种情况下!)-看这个)功能等同于你的代码(但更有效)

你的代码工作的原因是因为m参数没有以任何方式使用,lambda(这是有效的函数体)内部的代码使用函数外部声明的变量(=>之后的代码)。这被称为闭包'捕获变量-它效率较低,有许多陷阱,但非常有用…

2) 如果这无关紧要,为什么我必须在=>之前写任何东西?

因为@Html.DisplayFor方法被声明为接受Func<TModel, TValue>参数,你可以把它读成'函数,它接受一个参数(模型)并返回单个值'

3)使用正常(匿名)方法语法:

@foreach (var comment in Model.Comments) {
            <p> @Html.DisplayFor(delegate(CommentsType c) { return c.TimeStamp; })</p>
}

…其中CommentsTypeModel.Comments属性的类型