Typy anonimowe (Visual Basic)
Visual Basic obsługuje typy anonimowe, które umożliwiają utworzyć obiektów bez potrzeby pisania definicji klasy dla typ danych.Zamiast tego, kompilator generuje klasy dla Ciebie.Klasa ma można używać nazwy, dziedziczy bezpośrednio z Objecti zawiera właściwości do określenia w do obiekt.Ponieważ nie określono nazwy typ danych , to nazywa się Typ anonimowy.
W poniższym przykładzie deklaruje i tworzy zmienna product jako instancja typ anonimowy, który ma dwie właściwości, Name i Price.
' Variable product is an instance of a simple anonymous type.
Dim product = New With {Key .Name = "paperclips", .Price = 1.29}
A wyrażenie kwerenda używa typy anonimowe do łączenia kolumn danych wybranych przez kwerenda.Typu wyniku nie można definiować z góry, ponieważ nie można przewidzieć kolumny wybrane danej kwerenda .Typy anonimowe umożliwiają napisać kwerenda wybierające dowolną liczbę kolumn, w dowolnej kolejności.kompilator utworzy typ danych , który pasuje do określonej właściwości i w kolejności określonej.
W poniższych przykładach products jest lista obiektów produktu, z których każda ma wiele właściwości.Zmienna namePriceQuery posiada definicji kwerenda , która, gdy jest wykonywane, zwraca kolekcję wystąpień typ anonimowy, który ma dwie właściwości, Name i Price.
Dim namePriceQuery = From prod In products
Select prod.Name, prod.Price
Zmienna nameQuantityQuery posiada definicji kwerenda , która, gdy jest wykonywane, zwraca kolekcję wystąpień typ anonimowy, który ma dwie właściwości, Name i OnHand.
Dim nameQuantityQuery = From prod In products
Select prod.Name, prod.OnHand
Aby uzyskać więcej informacji na temat kodu, utworzona przez kompilator typ anonimowy, zobacz Definicja typu anonimowego (Visual Basic).
Przestroga |
---|
Nazwa Typ anonimowy jest kompilator generowane i mogą się różnić od kompilacja.Kodu nie należy używać lub polegać na nazwę Typ anonimowy, ponieważ nazwa mogą ulec zmianie, gdy projekt jest ponownie kompilowana. |
Deklarowanie typ anonimowy
Deklaracja wystąpienia typ anonimowy używa listy inicjatorów do określania właściwości typu.zadeklarować na anonimowe typu nie można określić właściwości tylko do innych elementów klasy, takie jak metody lub zdarzenia.W poniższym przykładzie product1 jest instancją typ anonimowy, który ma dwie właściwości: Name i Price.
' Variable product1 is an instance of a simple anonymous type.
Dim product1 = New With {.Name = "paperclips", .Price = 1.29}
' -or-
' product2 is an instance of an anonymous type with key properties.
Dim product2 = New With {Key .Name = "paperclips", Key .Price = 1.29}
Po wyznaczeniu właściwości jako właściwości klucza, można użyć ich do porównywania dwóch wystąpień typ anonimowy dla równości.Jednakże nie można zmienić wartości właściwości klucza.W sekcji właściwości klucza w dalszej części tego tematu, aby uzyskać więcej informacji.
Należy zauważyć, że deklarowanie instancji typ anonimowy przypomina deklarowanie instancji typu nazwanego za pomocą inicjatora obiekt :
' Variable product3 is an instance of a class named Product.
Dim product3 = New Product With {.Name = "paperclips", .Price = 1.29}
Aby uzyskać więcej informacji na temat innych sposobów określić właściwości Typ anonimowy, zobacz Jak: wywnioskować nazwy właściwości i typów w deklaracji typu anonimowego (Visual Basic).
Właściwości klucza
Właściwości klucza różnią się od właściwości do kluczy w kilka podstawowych sposobów:
Wartości właściwości klucza są porównywane w celu ustalenia, czy dwa wystąpienia są równe.
Wartości właściwości klucza są tylko do odczytu i nie mogą być zmieniane.
Tylko wartości klucza właściwość są uwzględniane w kompilator-wygenerowany wartość skrótu algorytm typ anonimowy.
Równości
Wystąpienia typów, anonimowe może być równa tylko wtedy, gdy są one wystąpień tego samego rodzaju anonimowe.kompilator traktuje dwa wystąpienia jako wystąpień tego samego typu, jeżeli spełniają następujące warunki:
Są one zgłoszone tego samego zestaw.
Ich właściwości tych samych nazwach, te same typy nie powiązano i są deklarowane w tej samej kolejności.Nazwa porównania nie jest rozróżniana.
Te same właściwości w każdym są oznaczone jako właściwości klucza.
Każda deklaracja co najmniej jedna właściwość jest kluczową właściwość.
Wystąpienia typów anonimowy nie ma klucza właściwości jest równy sobie samemu.
' prod1 and prod2 have no key values.
Dim prod1 = New With {.Name = "paperclips", .Price = 1.29}
Dim prod2 = New With {.Name = "paperclips", .Price = 1.29}
' The following line displays False, because prod1 and prod2 have no
' key properties.
Console.WriteLine(prod1.Equals(prod2))
' The following statement displays True because prod1 is equal to itself.
Console.WriteLine(prod1.Equals(prod1))
Dwa wystąpienia tego samego rodzaju anonimowe są równe, jeżeli wartości ich właściwości klucza są równe.Poniższe przykłady ilustrują, w jaki sposób jest badany równości.
Dim prod3 = New With {Key .Name = "paperclips", Key .Price = 1.29}
Dim prod4 = New With {Key .Name = "paperclips", Key .Price = 1.29}
' The following line displays True, because prod3 and prod4 are
' instances of the same anonymous type, and the values of their
' key properties are equal.
Console.WriteLine(prod3.Equals(prod4))
Dim prod5 = New With {Key .Name = "paperclips", Key .Price = 1.29}
Dim prod6 = New With {Key .Name = "paperclips", Key .Price = 1.29,
.OnHand = 423}
' The following line displays False, because prod5 and prod6 do not
' have the same properties.
Console.WriteLine(prod5.Equals(prod6))
Dim prod7 = New With {Key .Name = "paperclips", Key .Price = 1.29,
.OnHand = 24}
Dim prod8 = New With {Key .Name = "paperclips", Key .Price = 1.29,
.OnHand = 423}
' The following line displays True, because prod7 and prod8 are
' instances of the same anonymous type, and the values of their
' key properties are equal. The equality check does not compare the
' values of the non-key field.
Console.WriteLine(prod7.Equals(prod8))
Wartości tylko do odczytu
Nie można zmienić wartości właściwości klucza.Na przykład w prod8 w poprzednim przykładzie, Name i Price pola są read-only, ale OnHand mogą być zmieniane.
' The following statement will not compile, because Name is a key
' property and its value cannot be changed.
' prod8.Name = "clamps"
' OnHand is not a Key property. Its value can be changed.
prod8.OnHand = 22
Typy anonimowe od wyrażenia w kwerendzie
Wyrażenia w kwerendzie nie zawsze wymagają utworzenia typy anonimowe.Jeśli to możliwe, korzystają z istniejących typów do przechowywania danych kolumny.Dzieje się tak, gdy kwerenda zwraca albo całe rekordy z źródło danychlub tylko jednego pole każdego rekordu.W poniższych przykładach kodu customers jest zbiorem obiektów Customer klasy.Klasa ma wiele właściwości, i może zawierać jedną lub więcej z nich w wyniku kwerenda w dowolnej kolejności.Pierwsze dwa przykłady typy anonimowe, nie są wymagane, ponieważ kwerendy Wybierz elementy nazwane typy:
custs1zawiera Kolekcja ciągów, ponieważ cust.Name jest ciągiem.
Dim custs1 = From cust In customers Select cust.Name
custs2Kolekcja zawiera Customer obiektów, ponieważ każdy element customers jest Customer obiektoraz cały element jest wybierany przez kwerenda.
Dim custs2 = From cust In customers Select cust
Jednakże właściwe nazwane typy nie są zawsze dostępne.Warto wybierz kontrahent , nazwy i adresy jeden cel, numery ID kontrahent i lokalizacje innego i nazwy kontrahent , adresy oraz opisy zamówienia dla trzeciego.Typy anonimowe pozwalają wybrać dowolną kombinację właściwości, w dowolnej kolejności, bez zgłaszania pierwszy nowy typ nazwany do przechowania rezultatów.Zamiast tego, kompilator tworzy typ anonimowy dla każdej kompilacji właściwości.Następująca kwerenda wybiera tylko nazwy kontrahenti numer identyfikacyjny każdego Customer obiekt w customers. W związku z tym, kompilator tworzy typ anonimowy, zawierający tylko te dwie właściwości.
Dim custs3 = From cust In customers
Select cust.Name, cust.ID
Zarówno nazwy i typy danych właściwości w polu Typ anonimowy są pobierane z argumentami, do Select, cust.Name i cust.ID.Właściwości w polu Typ anonimowy, utworzony przez kwerenda są zawsze kluczowych właściwości.Gdy custs3 jest wykonywana w następujących For Each pętli, wynik jest kolekcją wystąpień typ anonimowy z dwiema właściwościami klucza, Name i ID.
For Each selectedCust In custs3
Console.WriteLine(selectedCust.ID & ": " & selectedCust.Name)
Next
Elementy w kolekcji, reprezentowana przez custs3 mają jednoznacznie określone typy i IntelliSense można używać do poruszania się dostępnych właściwości i weryfikacji ich typów.
Aby uzyskać więcej informacji, zobacz Wprowadzenie do LINQ w języku Visual Basic.
Czy warto używać typy anonimowe
Przed rozpoczęciem utworzyć obiekt jako instancja klasy anonimowe, należy rozważyć, czy to najlepsza opcja.Na przykład jeśli chcesz utworzyć tymczasowy obiekt zawiera dane pokrewne i użytkownik nie ma potrzeby dla innych pól i metod, które mogą zawierać pełną klasy, typ anonimowy jest to dobre rozwiązanie.Typy anonimowe również są wygodne, jeśli chcesz różnych zaznaczenie właściwości dla każdego zgłoszenia lub jeśli chcesz zmienić kolejność wyświetlania właściwości.Jednakże, jeśli projekt zawiera kilka obiektów, które mają te same właściwości w ustalonej kolejności, możesz zadeklarować je łatwiej, używając typu nazwanego z klasy konstruktor.Na przykład z odpowiedniego konstruktor, łatwiej jest zadeklarować kilka wystąpień Product klasy niż jest zadeklarować kilka wystąpień typ anonimowy.
' Declaring instances of a named type.
Dim firstProd1 As New Product("paperclips", 1.29)
Dim secondProd1 As New Product("desklamp", 28.99)
Dim thirdProd1 As New Product("stapler", 5.09)
' Declaring instances of an anonymous type.
Dim firstProd2 = New With {Key .Name = "paperclips", Key .Price = 1.29}
Dim secondProd2 = New With {Key .Name = "desklamp", Key .Price = 28.99}
Dim thirdProd2 = New With {Key .Name = "stapler", Key .Price = 5.09}
Inną zaletą nazwane typy to kompilator może przechwycić, przypadkowego zapamiętaną nazwa właściwość .W poprzednich przykładach firstProd2, secondProd2, i thirdProd2 mają być wystąpień tego samego rodzaju anonimowe.Jednakże gdyby przypadkowo zadeklarować thirdProd2 w jednym z następujących sposobów jej typ byłoby innym niż firstProd2 i secondProd2.
' Dim thirdProd2 = New With {Key .Nmae = "stapler", Key .Price = 5.09}
' Dim thirdProd2 = New With {Key .Name = "stapler", Key .Price = "5.09"}
' Dim thirdProd2 = New With {Key .Name = "stapler", .Price = 5.09}
Co ważniejsze istnieją ograniczenia użycia anonimowe typów, które nie stosują się do wystąpienia typów, nazwany.firstProd2, secondProd2, i thirdProd2 są instancjami tej samej typ anonimowy.Nazwę udostępnionego typ anonimowy jest niedostępny i nie może występować, gdy nazwa typu oczekuje się w kodzie.Na przykład typ anonimowy nie może służyć do definiowania podpis metoda , aby zadeklarować innej zmienna lub pole, lub w deklaracji dowolnego typu.W efekcie typy anonimowe nie są odpowiednie, gdy współdzielić informacje w całej metody.
W przypadku definicji typ anonimowy
W odpowiedzi na zgłoszenia wystąpienie typ anonimowy, kompilator utworzy nową definicję klasy, zawierający określone właściwości.
Jeśli typ anonimowy zawiera co najmniej jednego klucza właściwość, definicja zastępuje trzech członków dziedziczonych od Object: Equals, GetHashCode, i ToString.Kod produkowane do celów badania równości i określania wartości wartość skrótu uważa właściwości klucza.Jeśli typ anonimowy nie zawiera żadnych właściwości klucza, tylko ToString jest zastąpiona.Wyraźnie nazwane właściwości Typ anonimowy nie może powodować konfliktu z tych metod wygenerowany.Oznacza to, że nie można użyć .Equals, .GetHashCode, lub .ToString do nazwy właściwość.
Typ anonimowy definicje, które mają co najmniej jeden klucz właściwość również wdrożenie System.IEquatable<T> interfejs, gdzie T jest typem Typ anonimowy.
Aby uzyskać więcej informacji na temat kodu, utworzona przez kompilator i funkcjonalność metod przesłoniętych, zobacz Definicja typu anonimowego (Visual Basic).
Zobacz też
Zadania
Jak: wywnioskować nazwy właściwości i typów w deklaracji typu anonimowego (Visual Basic)
Informacje
Koncepcje
Inicjatory obiekt: Nazwany i anonimowe typów (Visual Basic)
Wnioskowanie typu lokalnego (Visual Basic)