【C#】我想了解@ Html.DisplayFor(modelItem => item.FirstName)中的lambda表示式
我是C#和MVC的新手,在某些場合使用過lambda,例如用於匿名方法和LINQ。
通常,我會看到如下所示的lambda表示式:
(x => x.Name), (x => { Console.WriteLine(x))
我瞭解到lambda =“goes to”。我從未見過不使用left引數的lambda表示式。
我不知道如何翻譯此lambda表示式
@Html.DisplayFor(modelItem => item.FirstName)
誰能為我闡明一下這一點?這不應該是
(modelItem => modelItem.FirstName)?
我是從Microsoft的Introduction to ASP.NET MVC tutorial獲得的。
解決辦法
Lambda表示式是一種編寫匿名函式(即沒有名稱的函式)的方法。在“箭頭”左側的內容是函式引數,而在右側的內容是函式主體。因此,(x => x.Name)在邏輯上轉換為類似string Function(Data x) { return x.Name }的型別,而string和Data的型別顯然將有所不同並從上下文派生。
缺少左側引數會轉換為不帶引數的函式,因此該(() => someVariable)在邏輯上會轉換為:string Function() { return someVariable; }
此時,您可能會開始懷疑someVariable的來源,它不是函式引數,並且未在函式中定義。您將是對的,像這樣的函式將永遠無法編譯。但是,這樣的lambda函式非常好,因為它允許提升和使用外部範圍變數。 (內部建立一個包裝器類,其中在lambda表示式中使用的變數將成為欄位。)
現在,讓我們看看model => item.FirstName的含義。從邏輯上講,它將轉換為string Function(Model model) { return item.FirstName; }。基本上,這是帶有引數的函式,但是不使用此引數。
現在,資訊的最後一點。儘管lambda表示式最後表示函式,但有時建立它們並不是出於實際執行的目的(儘管可能這樣做)。 Lambda表示式可以以表示式樹的形式表示。這意味著可以解析它而不是執行它。
在這種特殊情況下,MVC引擎不會執行lambda表示式表示的功能。取而代之的是解析表示式,以便MVC引擎知道要為該特定行發出的html。如果您的資料項不是直接來自模型物件,則lambda表示式的左側部分無關緊要。