【问题标题】:What is the difference between inspection and evaluation?检查和评估有什么区别?
【发布时间】:2018-07-31 02:42:50
【问题描述】:

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

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

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

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

我理解直觉的检查,但这与说:

Console.WriteLine(Movie[0].Title)

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

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

【问题讨论】:

    标签: c# asp.net razor lambda


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

      1. 检查 Microsoft 参考源或可用的开源代码版本之一以了解它在幕后的工作原理总是一个好主意。 Visit the source
      2. 通过查看源代码,您将看到,框架没有访问它自己的对象,而是使用它自己的表达式中的Metadata 来获取表达式中属性的显示名称,因此即使它不会导致任何异常对象为空。

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

      【讨论】:

        猜你喜欢
        • 2016-12-02
        • 2012-03-22
        • 1970-01-01
        • 2013-02-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-22
        相关资源
        最近更新 更多