使用 Asp.Net MVC 已经有一段时间了,但我遇到了一个非常奇怪的问题。每次创建模型时,我都会使用 lambda 表达式,例如:
@Html.EditorFor(model=>model.SomeProperty)
为什么 Asp.Net MVC 使用这种类型的架构?
为什么我不能只使用反射传入一个属性?
使用 lambda 表达式更快吗?因为在幕后,我认为要获得属性名称,它必须使用反射。
使用 Asp.Net MVC 已经有一段时间了,但我遇到了一个非常奇怪的问题。每次创建模型时,我都会使用 lambda 表达式,例如:
@Html.EditorFor(model=>model.SomeProperty)
为什么 Asp.Net MVC 使用这种类型的架构?
为什么我不能只使用反射传入一个属性?
使用 lambda 表达式更快吗?因为在幕后,我认为要获得属性名称,它必须使用反射。
Lambda > 反射
使用 lambdas 你得到:
多亏了 lambdas,任何 API 都可以从属性选择器中知道很多事情:
另外,检查方法签名(http://msdn.microsoft.com/en-us/library/ee402949(v=vs.108).aspx):
public static MvcHtmlString EditorFor<TModel, TValue>(
this HtmlHelper<TModel> html,
Expression<Func<TModel, TValue>> expression
)
它是一个表达式树,而不是一个常规的 lambda。这允许 MVC(以及任何 API)操作表达式,以便在运行时调用它之前添加更多行为,而无需反射发射。
了解有关表达式树的更多信息:
我的回答不会受欢迎。
我相信 Lambda 的 99% 始终是更好的选择,原因有以下三个。
首先,假设您的开发人员很聪明,这绝对没有错。其他答案有一个基本前提,即除了您之外的每个开发人员都是愚蠢的。不是这样。
其次,Lamdas (et al) 是一种现代语法——明天它们将比现在更普遍。您的项目代码应该来自当前和新兴的约定。
第三,以“老式方式”编写代码对您来说似乎更容易,但对编译器来说却并不容易。这很重要,随着编译器的修订,遗留方法几乎没有机会改进。依赖编译器扩展它们的 Lambdas(等)可以受益,因为编译器会随着时间的推移更好地处理它们。
总结一下:
Again, I know this will not be a popular answer. And believe me "Simple is Best" is my mantra, too. Maintenance is an important aspect to any source. I get it. But I think we are overshadowing reality with some cliché rules of thumb.