为什么在ASP.NET MVC中使用lambdas而不是反射?

时间:2013-02-08 08:50:20

标签: asp.net-mvc reflection lambda

现在与Asp.Net MVC合作已有一段时间了,但我陷入了一个非常奇怪的问题。每次我创建一个模型时,我都会使用lambda表达式,如:

@Html.EditorFor(model=>model.SomeProperty)

为什么Asp.Net MVC使用这种类型的架构?

为什么我不能使用反射传递属性?

使用lambda表达式更快吗?因为在引擎盖下,我认为要获得属性名称必须使用反射。

2 个答案:

答案 0 :(得分:9)

Lambda>反射

使用lambdas得到:

  • 设计时,强类型属性选择器。
  • 使用内置的Visual Studio重构工具轻松进行重构。

感谢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)操作表达式,以便在运行期间调用它之前添加更多行为,而不会发生反射。

详细了解表达式树:

答案 1 :(得分:1)

我的回答不会受欢迎。

我认为Lambda的99%总是更好的选择,原因有三个。

首先,假设您的开发人员很聪明,绝对没有错。其他答案有一个潜在的前提,即每个开发人员,但你是愚蠢的。不是这样。

其次,Lamdas(等人)是一种现代语法 - 明天他们将比现在更常见。您的项目代码应该来自当前和新兴的惯例。

第三,编写代码“老式的方式”对你来说似乎更容易,但对编译器来说并不容易。这很重要,随着编译器的重新编译,遗留方法几乎没有机会得到改进。 Lambdas(等)依靠编译器来扩展它们可以从中受益,因为编译器会随着时间的推移更好地处理它们。

总结一下:

  1. 开发人员可以处理它
  2. 每个人都在这样做
  3. 未来潜力
  4. 同样,我知道这不是一个受欢迎的答案。相信我“简单就是最好”也是我的口头禅。维护是任何来源的重要方面。我知道了。但我认为我们用一些陈词滥调的经验法则掩盖了现实。