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

C# 检查和评估之间有什么区别?,c#,asp.net,razor,lambda,C#,Asp.net,Razor,Lambda,我正在阅读有关Microsoft Docs的教程,遇到了HTML帮助程序中使用的lambda表达式: @Html.DisplayNameFor(model => model.Movie[0].Title)) Movie是IList类型,其中Movie是在教程中创建的类。提交人说: “DisplayName for HTML Helper检查lambda表达式中引用的标题属性以确定显示名称。lambda表达式是检查而不是评估的。这意味着当电影[0]为null或为空时,不存在访问冲突。” 我

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

@Html.DisplayNameFor(model => model.Movie[0].Title))
Movie是IList类型,其中Movie是在教程中创建的类。提交人说:

“DisplayName for HTML Helper检查lambda表达式中引用的标题属性以确定显示名称。lambda表达式是检查而不是评估的。这意味着当电影[0]为null或为空时,不存在访问冲突。”

我从直觉中理解检查,但这与我们说的有什么区别:

Console.WriteLine(Movie[0].Title)
如果HTML助手看到空列表,则没有问题,但是如果console方法看到空列表,则会引发异常


我能猜出它是如何工作的唯一方法是,在幕后有一个try/catch在起作用。

显示名称意味着属性本身的名称,即
“Title”
,或者属性上的
显示
属性中定义的字符串值(如果属性有),即:

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

我们可以看到,它不关心
Title
属性的值,因此它不需要对其求值,因此如果电影为空,它不会抛出。

只想在Saeb Amini的答案中添加一些东西

  • 最好检查Microsoft参考源代码或可用的开源版本代码,以了解其幕后工作情况
  • 通过查看源代码,您将看到,框架没有访问它自己的对象,而是使用表达式中的
    元数据
    ,以获取表达式中属性的显示名称,因此即使对象为null,也不会导致任何异常
  • 最后,为了回答您的问题,求值是当您实际为结果(调用)求值lamda表达式时,而检查是当您检查lamda表达式的各种属性时