Анонимные типы в VB.NET
Давайте разберём создание и применение анонимного типа на примере, чтобы стало яснее.
Dim board1 As New With { .Title = "Arduino UNO", .PinsNumber = 32 } Dim board2 = New With { .Title = "Arduino Nano", .PinsNumber = 30 } Dim lst As New List(Of Object) From {board1, board2} board2.PinsNumber = 10 For Each o As Object In lst Console.WriteLine(o) Console.WriteLine(o.GetType()) Next
Вот что мы увидим в выводе этого кода:
Здесь мы создали два анонимных объекта board1 и board2, не указав их тип. Компилятор не знает, что это за сущности. Но он понимает, что нам нужно, поэтому он неявно создаст поддерживающий класс VB$AnonymousType_0`2 (название может меняться), который содержит свойства Title и PinsNumber типов System.String и System.Integer, соответственно. Структуру анонимного типа компилятор узнаёт по конструктору, который мы вызываем. Надо иметь в виду, что если бы конструкторы анонимных типов имели разную сигнатуру, то были бы созданы несколько различных поддерживающих классов, по числу различных конструкторов анонимных объектов. Также обратите внимание, что мы использовали два разных синтаксиса при создании анонимных типов: "As New" и "= New".
В C# также имеются анонимные типы, и свойства этих объектов в C# предназначены только для чтения. В VB.NET же свойства можно менять в течение жизни такого объекта, что демонстрирует строка, где мы изменили число выводов Arduino Nano после создания объекта.
Названия поддерживающих типов компилятор выбирает на своё усмотрение и управлять этим нельзя. Зато анонимные типы могут хранить другие анонимные типы, это не возбраняется. Анонимные типы наследуются от типа System.Object.