猿问

检查和评估有什么区别?

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

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

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

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

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

Console.WriteLine(Movie[0].Title)

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

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


至尊宝的传说
浏览 507回答 2
2回答

侃侃无极

显示名称表示属性本身的名称,即"Title",或Display属性上的属性中定义的字符串值,如果该属性有一个,即:public class Movie{&nbsp; &nbsp; [Display(Name = "Movie Title")]&nbsp; &nbsp; public string Title { get; set; }}我们可以看到它并不关心Title属性的value,因此它永远不需要评估它,因此如果电影为 null 它不会抛出。

郎朗坤

只想在 Saeb Amini 的回答中添加一些内容。检查 Microsoft 参考源或可用代码的开源版本之一以了解其在幕后的工作方式始终是个好主意。访问源通过查看源代码,您将看到,框架并没有访问它自己的对象,而是使用它自己Metadata的表达式来获取表达式中属性的显示名称,因此即使对象为空,它也不会导致任何异常。最后,为了回答您的问题,评估是当您实际评估结果(调用)的 lamda 表达式时,而检查是当您检查 lamda 表达式的各种属性时。
随时随地看视频慕课网APP
我要回答