c #, что означает метод (new {x = y.property})? - PullRequest
2 голосов
/ 11 января 2010

Я смотрел несколько видео на MVC asp.net, но я думаю, что этот вопрос является просто общим C #.

Иногда я замечаю, что в примере кода параметры метода вызываются так

blah.method("something here",
            "Something else",
            new { blah=item.someProperty });

Можете ли вы объяснить, что происходит с третьим параметром? Как я вижу из видео, которое я смотрю, метод принимает объект для третьего параметра.

Ответы [ 2 ]

6 голосов
/ 11 января 2010

Это анонимный тип, свойство которого называется blah, учитывая значение из оценки item.someProperty. В некоторых случаях это интересный способ передачи набора пар ключ / значение - проще, чем словарь, например:

new {Forename="Fred", Surname="Jones" }

проще, чем то же самое со словарем и двумя записями («Имя» / «Фред», «Фамилия» / «Джонс»). MVC использует этот подход в ряде мест для передачи полуобязательных параметров (немного похоже на соглашение о конфигурации). Он также вполне сопоставим с большинством jQuery, и давайте посмотрим правде в глаза: большинство пользователей MVC также используют jQuery, поэтому два подхода к сайту довольно хорошо сочетаются.

Я обсуждаю эту тему (наряду с string.Format примером из SO) в моем блоге, здесь: Просто передавайте данные; учимся на jQuery и ASP.NET MVC .

4 голосов
/ 11 января 2010

Третий объект - анонимный тип . По сути, это тип без имени, который компилятор создает для вас, чтобы вы могли передавать или манипулировать информацией, не требуя от разработчика создания для нее определенного типа.

Эта практика довольно часто встречается в коде, использующем LINQ, где анонимные типы используются для упрощения процесса создания проекций.

Анонимные типы создаются с использованием следующего синтаксиса:

var anonType = new { Age = 25, Color = "Red", ... };

Вы можете назначать анонимные типы только переменным типа var (или object). Любые анонимные типы, имеющие одинаковые имена полей одного и того же типа, считаются идентичными компилятором.

Анонимные типы также определяют некоторую разумную семантику равенства и хэширования, поэтому их можно сравнивать и использовать в качестве ключей словаря.

Анонимные типы могут превосходить object [] или Tuple. Во-первых, они строго типизированы - это означает, что вы не можете случайно смешать несовместимые анонимные типы. Во-вторых, они позволяют таким инструментам, как VisualStudio, предоставлять intellisense. В-третьих, они автоматически генерируют для вас семантику сравнения и хеширования, как упоминалось выше. Наконец, в отличие от Tuple <>, вы можете определить анонимный тип с любым количеством полей - что нецелесообразно для Tuple.

...