检查和评估有什么区别?

5

我正在学习微软文档上的Razor教程,遇到了在HTML辅助程序中使用的lambda表达式:

@Html.DisplayNameFor(model => model.Movie[0].Title))

电影类型为IList< Movie >,其中Movie是本教程中创建的一个类。作者指出:
DisplayNameFor HTML Helper 检查lambda表达式中引用的Title属性以确定显示名称。Lambda表达式被检查而不是被评估。这意味着当Movie[0]为空或空字符串时,没有访问违规。”
我从直觉上理解检查,但这与以下说法有何不同:
Console.WriteLine(Movie[0].Title)

如果HTML助手看到一个空的列表没有问题,但如果控制台方法看到一个空的列表,将会抛出异常。 我唯一猜测这是如何工作的背后,在幕后有一个try / catch正在工作。
2个回答

5

显示名称指的是属性本身的名称,如"Title",或者如果该属性具有Display属性中定义的字符串值,则为该属性上Display属性中定义的字符串值,例如:

public class Movie
{
    [Display(Name = "Movie Title")]
    public string Title { get; set; }
}

我们可以看到它并不关心Title属性的值,所以它永远不需要对其进行评估,因此如果电影为null,它也不会抛出异常。

5
我想补充一下Saeb Amini的答案。
  1. 查看Microsoft参考源代码或其中一个可用的开源版本来获取其背后的工作原理总是明智的。 请访问该源
  2. 通过查看源代码,您会发现框架并没有直接访问对象本身,而是使用表达式中的Metadata来获取表达式中属性的显示名称,因此即使对象为空,也不会导致任何异常。
最后,回答您的问题,评估是指实际评估lamda表达式的结果(调用),而检查是指检查lamda表达式的各种属性。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接