检查和评估之间有什么区别?

时间:2018-07-31 02:42:51

标签: c# asp.net razor lambda

我正在阅读有关Microsoft Docs的Razor教程,并遇到了HTML帮助器中使用的lambda表达式:

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

电影的类型为IList <电影>,其中电影是在教程中创建的类。作者指出:

DisplayNameFor HTML帮助器检查 lambda表达式中引用的 Title 属性以确定显示名称。lambda表达式为检查而不是评估。这意味着当Movie [0]为空或为空时,没有访问冲突。”

我从直觉上了解检查,但这与所说的有何不同

Console.WriteLine(Movie[0].Title)

如果HTML帮助程序看到一个空列表,则没有问题,但是如果控制台方法看到一个空列表,则将引发异常。

我唯一能猜到它是如何工作的方法是在幕后进行尝试/捕获。

2 个答案:

答案 0 :(得分:2)

显示名称表示属性本身的名称,即"Title"或属性的Display属性中定义的字符串值(如果属性有一个,即:

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

我们可以看到它并不关心Title属性的 value ,因此它不需要评估,因此,如果这部电影是空的。

答案 1 :(得分:2)

只想在Saeb Amini的回答中添加一些内容。

  1. 始终最好检查Microsoft参考源或可用的开源版本代码之一,以获取有关其幕后工作方式的提示。 Visit the source
  2. 通过查看源代码,框架不会访问其自身的对象,而是从其自身的表达式中使用Metadata来获取表达式中该属性的显示名称,因此不会导致任何异常即使object为null。

最后,要回答您的问题,评估是指您实际对结果(调用)的lamda表达式求值,而检查是当您检查lamda表达式的各种属性时。