为什么我可以在=>在lambda表达式中,如何将其转换为标准语法
本文关键字:转换 语法 标准 我可以 lambda 表达式 为什么 | 更新日期: 2023-09-27 17:51:14
我已经尝试理解lambda表达式很长时间了(多次尝试)。
在Razor视图中,我在ICollection<Comment> Comments
上有一个foreach
循环,其中Model
是Product
类。
@foreach (var comment in Model.Comments) {
<p> @Html.DisplayFor(m => comment.TimeStamp)</p>
}
我不明白为什么我可以在表达式中使用=>
之前的任何字母,它仍然有效。如果这并不重要,为什么我必须在=>
之前写任何东西?
如何翻译(如果可能的话)到标准方法语法?
在您的示例中,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>
}
…其中CommentsType
为Model.Comments
属性的类型