Анонимный тип
Анонимный тип (англ. Anonymous types) — одно из нововведений в языках C# 3.0, Visual Basic .NET 9.0 и Oxygene, позволяющее типам данных инкапсулировать набор свойств в едином объекте без необходимости предварительного явного указания типа[1]. Это одна из важнейших особенностей SQL-подобного языка LINQ, интегрированного в языки C# и VB.net. Поскольку анонимные типы не поддерживают типизацию имён, то они должны храниться в переменных, объявленных при помощи ключевого слова var
, сообщающего компилятору языка C# использовать вывод типов для данной переменной. Такие свойства в языке C# доступны только для чтения, однако в языке VB.net они доступны и для изменения (чтение-запись).
Сравнение с динамической типизацией
Данную возможность не следует путать с динамической типизацией. Несмотря на то, что анонимные типы позволяют программисту определять поля «на лету», они все равно остаются статическими сущностями. Проверка типа выполняется во время компиляции, и попытка получить доступ к несуществующему полю вызовет ошибку компиляции. Это позволяет программисту воспользоваться удобством динамического языка наряду с безопасностью типов языка со статической типизацией.
Примеры
На языке C#
var person = new {FirstName = "Иван", LastName = "Иванов"}
var size = new {Heigth = 7, Weigth = 5, Depth = 5}
На языке Visual Basic .NET
Dim person = New With {.FirstName = "Иван", .LastName = "Иванов"}
На языке Oxygene
var person := new class(FirstName := 'Пётр', LastName := 'Петров');
На языке OCaml
let person = object val firstName = "Пётр" val lastName = "Петров" end;;
Критика
Одним из главных недостатков анонимного типа в C# 3.0 является невозможность экспортировать его за пределы метода, в котором его создали. Данное ограничение связано с унаследованными ограничениями CLR .NET Framework 2.0, в котором не были предусмотрены анонимные типы. Как следствие, невозможно разрешить конфликт имен при экспорте анонимного типа с совпадающей сигнатурой, и соответственно, анонимный тип нельзя сделать видимым за пределами сборки. Ограничение на методы накладывается потому, что они могут быть экспортированы в другие сборки, что и вызвало бы описанную проблему[2].
См. также
- Метод расширения
- Анонимная функция
- Дерево разбора
Примечания
- Anonymous Types (C# Programming Guide) . Microsoft. Дата обращения: 25 ноября 2008. Архивировано 23 июля 2012 года.
- C# 3.0 и LINQ. Концепции C# 3.0, позволившие создать LINQ (рус.)