Inicjatory obiektów: typy nazwane i anonimowe (Visual Basic)
Inicjatory obiektu umożliwiają określenie właściwości dla obiektu złożonego przy użyciu pojedynczego wyrażenia.One można utworzyć wystąpienia nazwanego typów i typy anonimowe.
Deklaracje
Deklaracje wystąpienia typów, nazwany i anonimowy może wyglądać prawie identyczne, ale ich skutki nie są takie same.Każda kategoria ma możliwości i ograniczenia własnej.W poniższym przykładzie pokazano wygodnym sposobem deklaruje i inicjujących wystąpienie klasy nazwane, Customer, za pomocą listy inicjatorów obiektu.Należy zauważyć, że po słowie kluczowym określono nazwę klasy New.
Dim namedCust = New Customer With {.Name = "Terry Adams"}
Typ anonimowy nie ma można używać nazwy.Dlatego wystąpienia typ anonimowy nie może zawierać nazwę klasy.
Dim anonymousCust = New With {.Name = "Hugo Garcia"}
Wymagania i wyników dwie deklaracje nie są takie same.Dla namedCust, Customer klasy, która ma Name właściwość musi już istnieć i deklaracji tworzy wystąpienie tej klasy.Dla anonymousCust, kompilator definiuje nowa klasa, która będzie miała jedną właściwość, ciąg znaków o nazwie Namei tworzy nowe wystąpienie tej klasy.
Nazwane typy
Inicjatory obiektu zapewniają prosty sposób na wywołanie konstruktora typu, a następnie ustaw wartości niektórych lub wszystkich właściwości w pojedynczej instrukcji.Kompilator wywołuje odpowiedniego konstruktora dla instrukcji: Konstruktor domyślny, jeśli są przedstawione żadne argumenty lub konstruktora sparametryzowana, jeśli jeden lub więcej argumentów są wysyłane.Po tym, że określone właściwości są inicjowane w kolejności, w jakiej są przedstawione na liście inicjatora.
Każdy Inicjalizacja listy inicjatorów składa się z przypisania wartości początkowej do członka klasy.Nazwy i typy danych członków są określane, gdy klasa jest zdefiniowana.W poniższych przykładach Customer klasy musi istnieć i musi mieć nazwę członków Name i City akceptuje wartości typu string.
Dim cust0 As Customer = New Customer With {.Name = "Toni Poe",
.City = "Louisville"}
Alternatywnie można uzyskać taki sam wynik, przy użyciu następującego kodu:
Dim cust1 As New Customer With {.Name = "Toni Poe",
.City = "Louisville"}
Każdy z tych deklaracji jest równoważna poniższy przykład, który tworzy Customer obiektu za pomocą konstruktora domyślnego, a następnie określa początkowe wartości dla Name i City właściwości za pomocą With instrukcji.
Dim cust2 As New Customer()
With cust2
.Name = "Toni Poe"
.City = "Louisville"
End With
Jeśli Customer klasa zawiera sparametryzowana konstruktora, który umożliwia wysyłanie wartości dla Name, można na przykład również zadeklarować i zainicjować Customer obiektu w następujący sposób:
Dim cust3 As Customer =
New Customer("Toni Poe") With {.City = "Louisville"}
' --or--
Dim cust4 As New Customer("Toni Poe") With {.City = "Louisville"}
Nie trzeba zainicjować wszystkie właściwości, jak w poniższym kodzie.
Dim cust5 As Customer = New Customer With {.Name = "Toni Poe"}
Jednak wykaz inicjalizacji nie może być pusta.Właściwości niezainicjowanej zachowują swoje wartości domyślne.
Wnioskowanie typu typu nazwanego
Można skrócić kodu dla deklaracji cust1 przez łączenie obiektu inicjatorów i wnioskowanie typu lokalnego.Dzięki temu można pominąć As klauzuli w deklaracji zmiennej.Typ danych zmiennej jest wywnioskować na podstawie typu obiektu, który jest tworzony przez przypisanie.W poniższym przykładzie typ cust6 jest Customer.
Dim cust6 = New Customer With {.Name = "Toni Poe",
.City = "Louisville"}
Uwagi dotyczące typów nazwane
Członek klasy nie można zainicjować więcej niż jeden raz na liście inicjator obiektu.Deklaracja z cust7 powoduje błąd.
'' This code does not compile because Name is initialized twice. ' Dim cust7 = New Customer With {.Name = "Toni Poe", ' .City = "Louisville", ' .Name = "Blue Yonder Airlines"}
Członek może służyć do zainicjowania samego lub innego pola.Jeżeli członek jest dostępny, zanim go został zainicjowany, jak w następującej deklaracji cust8, zostanie użyta wartość domyślna.Pamiętaj, że podczas przetwarzania deklaracji, że używa inicjatora obiektu pierwszą rzeczą, co się dzieje jest wywołaniu konstruktora właściwe.Po tym są inicjowane poszczególnych pól na liście inicjatora.W poniższych przykładach domyślną wartość dla Name jest przypisany do cust8, i zainicjować wartość jest przypisywana w cust9.
Dim cust8 = New Customer With {.Name = .Name & ", President"} Dim cust9 = New Customer With {.Name = "Toni Poe", .Title = .Name & ", President"}
W poniższym przykładzie użyto sparametryzowana konstruktora z cust3 i cust4 oświadczają, i zainicjować cust10 i cust11.
Dim cust10 = New Customer("Toni Poe") With {.Name = .Name & ", President"} ' --or-- Dim cust11 As New Customer("Toni Poe") With {.Name = .Name & ", President"}
Inicjatory obiektu mogą być zagnieżdżane.W poniższym przykładzie AddressClass jest klasa, która ma dwie właściwości, City i Stateoraz Customer klasa ma Address właściwość, która jest instancją AddressClass.
Dim cust12 = New Customer With {.Name = "Toni Poe", .Address = New AddressClass With {.City = "Louisville", .State = "Kentucky"}} Console.WriteLine(cust12.Address.State)
Inicjalizacja listy nie może być pusta.
Wystąpienie inicjowany nie może być typu obiektu.
Członkowie udostępnionego, członkowie tylko do odczytu, stałe lub wywołania metody, nie może być inicjowany członkowie klasy.
Członkowie klasy inicjowany nie indeksowanych lub kwalifikacje.Następujące przykłady podnieść błędy kompilatora:
'' Not valid.
' Dim c1 = New Customer With {.OrderNumbers(0) = 148662}
' Dim c2 = New Customer with {.Address.City = "Springfield"}
Typy anonimowe
Typy anonimowe umożliwia utworzenie wystąpień nowych typów, które nie zostanie jawnie zdefiniowana i nazwa obiektu inicjatorów.Zamiast tego kompilator generuje typu zgodnie z właściwości, które można wyznaczyć na liocie obiektów inicjatora.Ponieważ nazwa typu nie jest określony, to jest określane jako Typ anonimowy.Na przykład porównać następującą deklarację do poprzedniej dla cust6.
Dim cust13 = New With {.Name = "Toni Poe",
.City = "Louisville"}
Jedyną różnicą jest syntaktycznie, że nazwa nie zostanie określona, po New dla typu danych.Jednakże co się stanie, jest całkiem inna.Kompilator definiuje nowy typ anonimowy, który ma dwie właściwości, Name i Cityi tworzy instancję z określonej wartości.Wnioskowanie typ Określa typy Name i City w przykładzie ciągi znaków.
Przestroga |
---|
Nazwa Typ anonimowy jest generowany przez kompilator i mogą się różnić od kompilacja.Kod należy użyć lub nie polegać na nazwę Typ anonimowy. |
Ponieważ nazwa typu nie jest dostępna, nie można użyć As klauzuli zadeklarować cust13.Można wywnioskować jego typu.Bez korzystania z późnym wiązaniem, ogranicza użycie anonimowe typów zmiennych lokalnych.
Typy anonimowe zapewniają obsługę krytycznych LINQ kwerend.Aby uzyskać więcej informacji o używaniu typy anonimowe w kwerendach, zobacz Typy anonimowe (Visual Basic) i Wprowadzenie do LINQ w Visual Basic.
Uwagi dotyczące typów anonimowe
Zazwyczaj wszystkie lub większość właściwości w deklaracji typu anonimowego będzie kluczowych właściwości, które są wskazane przez wpisanie słowa kluczowego Key z przodu nazwy właściwości.
Dim anonymousCust1 = New With {Key .Name = "Hugo Garcia", Key .City = "Louisville"}
Aby uzyskać więcej informacji na temat właściwości klucza, zobacz Key (Visual Basic).
Jak o nazwie typów list Inicjator dla definicji typu anonimowego musi oświadczyć co najmniej jedna właściwość.
Dim anonymousCust = New With {.Name = "Hugo Garcia"}
Gdy wystąpienie typ anonimowy jest zadeklarowana, kompilator generuje pasujące definicji typ anonimowy.Nazwy i typy danych właściwości są pobierane z deklaracja instancji i są uwzględniane przez kompilator w definicji.Właściwości nie są o nazwie i określone z góry, tak jaki byłyby dla nazwanego typu.Niezamierzone są ich typów.Nie można określić typy danych właściwości za pomocą As klauzuli.
Typy anonimowe można również ustanowić nazwy i wartości ich właściwości w inny sposób.Na przykład właściwość Typ anonimowy może przyjąć, nazwę i wartość zmiennej, lub nazwa i wartość właściwości innego obiektu.
' Create a variable, Name, and give it an initial value. Dim Name = "Hugo Garcia" ' Variable anonymousCust2 will have one property, Name, with ' "Hugo Garcia" as its initial value. Dim anonymousCust2 = New With {Key Name} ' The next declaration uses a property from namedCust, defined ' in an earlier example. After the declaration, anonymousCust3 will ' have one property, Name, with "Terry Adams" as its value. Dim anonymousCust3 = New With {Key namedCust.Name}
Aby uzyskać więcej informacji o opcjach służącego do definiowania właściwości w typy anonimowe, zobacz Porady: wnioskowanie nazw właściwości i typów w deklaracjach typu anonimowego (Visual Basic).
Zobacz też
Zadania
Porady: wnioskowanie nazw właściwości i typów w deklaracjach typu anonimowego (Visual Basic)
Porady: deklarowanie obiektu za pomocą inicjatora obiektów (Visual Basic)