Анонимный тип

Материал из Википедии — свободной энциклопедии
Перейти к: навигация, поиск

Анонимный тип (англ. 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 = "Иванов"}

На языке 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].

См. также[править | править вики-текст]

Примечания[править | править вики-текст]

Ссылки[править | править вики-текст]