Вещь, что мне нравятся больше всего о Lisp (и Smalltalk) системы, состоит в том, что они чувствуют себя живыми. Можно легко зондировать & измените системы Lisp, в то время как они работают.
, Если это звучит таинственным, запустите Emacs и введите некоторый код Lisp. Тип C-M-x
и voilГ! Вы просто изменили Emacs из Emacs. Можно пойти и переопределить все функции Emacs, в то время как это работает.
Другая вещь состоит в том, что код = перечисляет эквивалентность, делают границу между кодом и данными очень тонкой. И благодаря макросам, очень легко расширить язык и сделать быстрым DSLs.
, Например, возможно кодировать основного разработчика HTML, с которым код очень близко к произведенному выводу HTML:
(html
(head
(title "The Title"))
(body
(h1 "The Headline" :class "headline")
(p "Some text here" :id "content")))
=>
The title
The Headline
Some text here
В коде Lisp, автоматическое добавление отступа заставляет код быть похожим на вывод, кроме нет никаких закрывающих тэгов.
Прежде чем я отвечу на ваши 2 пункта, я думаю, вам необходимо понять, что на самом деле представляют собой лямбда-выражения.
В .Net лямбда-выражения, используемые таким образом, называются деревьями выражений. Из MSDN :
Деревья выражений представляют код в древовидной структуре данных, где каждый узел является выражением, например, вызовом метода или двоичной операцией, такой как x < у.
Это, по сути, структуры данных, которые описывают то, что передается, а не значения передаваемых данных. Это означает, что когда вы вызываете Html.DisplayFor(x => model.Name)
, он передает структуру данных, которая говорит: Я вызываю этот метод для свойства Name структуры данных xxxx (где xxxx - это тип структуры данных, представляющий вашу модель представления).
Затем DisplayFor
просматривает эти данные и видит, что свойство name Name
- это Name, оно просматривает все атрибуты свойства, чтобы выяснить, есть ли к нему какие-либо аннотации данных, а затем просматривает значение, чтобы определить способ представления отображения значения. Это немного сложно. пока вы не обернетесь вокруг этого, но как только вы посмотрите на страницу MSDN и подумаете об этом, у вас будет момент ага! как у меня, и он просто внезапно обретет смысл:)
Что касается вашего Вопрос № 1, преимущество использования лямбда-выражений в том, что вы получаете проверку ваших свойств во время компиляции. Например, если вы переименуете ViewModel.Name
в ViewModel.ClientName
, все ваши Html.DisplayFor(x => model.Name)
не будут скомпилированы, поэтому убедитесь, что вы изменили их. Если вы не используете лямбда-выражения, все ваши вызовы Html.Display()
будут работать, но вы получите скрытые ошибки с привязкой к модели, которые не сразу поймут, в чем дело.
Чтобы ответить на вопрос № 2, причина та же, что и в моем описании деревьев выражений. Без использования лямбды вы просто передаете значение Model.Name
без информации о самом свойстве, поэтому он не знает, что имя свойства Model.Name
- это Name
, все, что он видит, - это строковое значение.
Другая хорошая запись Деревьев Выражений может быть найдена здесь . Понимание деревьев выражений открывает широкие возможности в .Net:)