Поделиться через


Сравнение именованных и анонимных типов

Обновлен: Ноябрь 2007

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

Объявления

В следующих примерах product1 представляет собой экземпляр анонимного типа, а product2 представляет собой экземпляр класса Product: Оба объявления используют список инициализации. Единственное синтаксическое различие в двух объявлениях — то, что после New для product1 не указан тип данных. Это делает его анонимным типом.

' Variable product1 is an instance of an anonymous type.
Dim product1 = New With {.Name = "paperclips", .Price = 1.29}

Переменная product1 строго типизирована как экземпляр анонимного типа. Компилятор определяет тип в соответствии со свойствами, указанными в объявлении. Компилятор использует Вывод локального типа, чтобы определить типы данных свойств из предоставленных начальных значений. В этом примере анонимный тип содержит свойства Name и Price. Их типы выводятся как String и Double, соответственно.

Bb531304.alert_note(ru-ru,VS.90).gifПримечание.

В предыдущем примере ни одно из свойств не задано как ключевое. Следовательно, свойства не играют роли в определении, одинаковы ли два экземпляра одного типа или каков хэш-код экземпляра. Тем не менее, значения свойств могут быть изменены, тогда как значения свойств ключа доступны только для чтения. Дополнительные сведения о свойствах см. в разделе Анонимные типы.

В следующем примере product2 — строго типизирован как экземпляр класса Product. Оба свойства, и Name и Price должны быть членами класса Product, а их типы должны быть совместимы со значениями, предоставленными в объявлении.

' Variable product2 is an instance of Product.
Dim product2 = New Product With {.Name = "paperclips", .Price = 1.29}

Дополнительные сведения см. в разделе Инициализаторы объектов: именованные и анонимные типы.

Различия

В следующем списке сравниваются другие аспекты двух объявлений:

  • Выведение локального типа определяет, что product1 представляет собой экземпляр анонимного типа и что product2 представляет собой экземпляр класса Product. Предложения As в объявлениях нет, хотя для product2 предложение As необязательно.

    • Поскольку анонимные типы не имеют заданных имен, нельзя использовать предложение As для объявления product1. Его тип должен быть выведен. Это ограничивает использование анонимных типов локальными переменными.

    • Поскольку product2 — это экземпляр именованного типа Product, его можно объявить без использования выведения типов с помощью предложения As.

      Dim product2a As New Product With {.Name = "paperclips", .Price = 1.29}
      
  • Если соответствующий конструктор определен в Product, то product2 может быть объявлен и инициализирован без использования инициализатора объектов.

    Dim product2b As New Product("paperclips", 1.29)
    

    Кроме того, следующий ряд инструкций выполняет те же действия.

    Dim product2c As New Product
    product2c.Name = "paperclips"
    product2c.Price = 1.29
    

    Объявление аналогичным образом для product1 невозможно, поскольку его свойства имеют имена и определены в списке инициализатора.

  • Поскольку product1, product2 и их свойства строго типизированы, можно использовать IntelliSense для переходов по коду, который использует любой из этих объектов.

    Bb531304.alert_caution(ru-ru,VS.90).gifВнимание!

    Имя анонимного типа создается компилятором и может отличаться для разных компиляций. Код не должен использовать или зависеть от имени анонимного типа, так как имя может измениться при повторной компиляции проекта.

См. также

Задачи

Практическое руководство. Объявление экземпляра анонимного типа

Практическое руководство. Выведение имен свойств и типов в объявлениях анонимных типов

Основные понятия

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

Вывод локального типа

Ссылки

Key (Visual Basic)