检查和评估有什么区别?

G. *_* LC 4 c# asp.net lambda razor

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

@Html.DisplayNameFor(model => model.Movie[0].Title))
Run Code Online (Sandbox Code Playgroud)

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

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

我从直觉上理解检查,但这与说有什么不同:

Console.WriteLine(Movie[0].Title)
Run Code Online (Sandbox Code Playgroud)

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

我能猜到这是如何工作的唯一方法是在幕后有一个 try / catch 在工作。

Sae*_*ini 5

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

public class Movie
{
    [Display(Name = "Movie Title")]
    public string Title { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我们可以看到它并不关心Title属性的value,因此它永远不需要评估它,因此如果电影为 null 它不会抛出。


Dip*_*hah 5

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

  1. 检查 Microsoft 参考源或可用代码的开源版本之一始终是个好主意,以获取其幕后工作方式的提示。访问源码
  2. 通过查看源代码,您将看到,框架并未访问其自身的对象,而是使用Metadata其自身的表达式来获取表达式中属性的显示名称,因此即使对象为空,也不会导致任何异常。

最后,为了回答你的问题,评估是当你实际评估 lamda 表达式的结果(调用)时,而检查是当你检查 lamda 表达式的各种属性时。